2

onEdit()2回目のトリガーを作成するためのトリガーを含むGoogleスプレッドシートがあります。

簡単に言うと、ステータス列が「承認済み」に編集されると、指定されたプロジェクトの完了日にフィードバックメールを送信するトリガーが作成されます。

var oneTimeOnly = ScriptApp.newTrigger("emailFeedback").timeBased().at(endDate).create();

2番目のトリガーに変数を渡したいです。プロジェクトプロパティを作成するか、スプレッドシートに列を追加できます。ただし、トリガーを作成するときに変数を渡す方が簡単です。

newTriggerの引用符の中に追加の文字を挿入すると、関数の内容全体がトリガーに格納されます(その後失敗します)。

var oneTimeOnly = ScriptApp.newTrigger("emailFeedback<strong>(regEmail)</strong>").timeBased().at(endDate).create();

トリガー内に変数を格納する方法はありますか?

4

5 に答える 5

3

ScriptDBとnewFunction()を使用して、動的トリガー関数を作成するためのメソッドを作成することができました。

解決策の要点は、トリガーするコードを格納することです。これは、渡すパラメーターを含むdbです。

"myFunction('Hello world')"

次に、スクリプトの開始時に、グローバル変数として、から新しく作成された関数をアタッチしますScriptDB。(これは、以下のリンクで動的に実行しました。)

globalFunctions.callThisOne = new Function("e", "myFunction("Hello world"));

最後に、トリガーを作成するときは、グローバルにアクセス可能な関数を使用してトリガーを作成しました。

ScriptApp.newTrigger("globalFunctions.callThisOne").timeBased().everyDay(1).create();

私はこれについて短い投稿を書き、ソースを投稿しました。うまくいけば、それは便利です。

あなたはここでそれについてもっと読むことができます:http://goo.gl/wbUqH6

または、ここのコードを参照してください:http: //goo.gl/zjUiYe

于 2013-08-26T15:00:05.547 に答える
2

申し訳ありませんが、これを行う方法はありません。

于 2012-07-20T15:47:08.217 に答える
2

私が正しく理解しているように、問題は、Googleスクリプトプロジェクトの時間トリガー関数にデータを渡す方法でした。Eoinは状況を説明しましたが、あなたは多くの人に直面しているかもしれません。スクリプトが長時間実行される可能性のある複雑なスプレッドシートを処理する典型的な状況。ご存知かもしれませんが、各スクリプトには約6分の実行制限があります。この状況では、スクリプトをより小さな論理パーティションに分割する必要があり、各パーティションの最後に次の部分の新しいトリガーを作成できます。わかりましたが、次の部分では、現在実行中のスクリプトの変数のデータについて知っておく必要があります。newTrigger()を介してこれらのデータを渡す方法がないため、スナップショットを作成して、シリアル化された方法でスクリプトプロパティコンテキストに配置できます。ScriptProperties.setProperty()で行う簡単な方法。

于 2013-03-14T20:07:18.843 に答える
1

ScriptProperties.setProperty()を使用して、トリガーメソッドでアクセスできるシリアル化されたパラメーターを格納します。

于 2013-03-13T17:21:20.813 に答える
0

@ user2166613は正しいですが、少し短いです。これがその方法です。

after()トリガーを使用する例を示します。これは非常に興味深いユースケースです。時間のかかるタスクをWebアプリの呼び出しなどから切り離すことができるため、呼び出しはすぐに制御を返し、処理はバックグラウンドで実行されます。

私の例では、この実行が遅れる関数でシートの列幅を調整します。

// call this function to set a time based trigger and transfer parameters
function setTimeTrigger_AdaptColumnWidths() {  
  var ssId = SpreadsheetApp.getActiveSpreadsheet().getId();
  var wsId = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getSheetId();

  var scriptProperties = PropertiesService.getScriptProperties();
  scriptProperties.setProperty('spreadsheetId', ssId);
  scriptProperties.setProperty('worksheetId', wsId);

  // Delay 10 secs, but real execution time may vary up to 15 min!
  ScriptApp.newTrigger('adaptColumnWidths').timeBased().after(10000).create();  
}

// this function is called by the trigger
function adaptColumnWidths() {  
  var scriptProperties = PropertiesService.getScriptProperties();
  ssId = scriptProperties.getProperty('spreadsheetId');
  wsId = scriptProperties.getProperty('worksheetId');

  // getSheetById() is a custom function – see below – not yet in Spreadsheet Class!
  sheet = getSheetById(SpreadsheetApp.openById(ssId), wsId);  

  // now do what we want to do in the timeBased trigger
  for (var i = 1; i <= sheet.getLastColumn(); i++){
    sheet.autoResizeColumn(i);
  }
}

// -----

// custom function – hopefully this will become a method of Spreadsheet Class any time soon
function getSheetById(ss, wsId) {
  var sheets = ss.getSheets();
  for (var i=0; i<sheets.length; i++) {
    if (sheets[i].getSheetId() == wsId)  return sheets[i];
  }
}

ここでは、すべての関数呼び出しに共通のデータスペースに格納していることに注意してください。したがって、短時間に複数の呼び出しを行うと、互いのパラメータが上書きされる可能性があります。

私のユースケースでは、スプレッドシートとワークシートは変更されないため、これは問題ではありません。ただし、通話ごとに変わる可能性のあるデータを転送しようとしないでください。

実際の実行の瞬間は最大15分まで変化する可能性があるため(正確な時間に関係なく)、複数の関数呼び出しが互いに干渉する余地が十分にあります!!!

于 2016-02-26T14:47:00.493 に答える