2

GoogleClock()関数に基づいて計算されたシートに含まれる時間に基づいて、プログラムで3つのトリガーを削除してからリセットし、毎日次の就業日に自動インクリメントする関数(以下を参照)があります(WORKDAY( ))関数とすべての休日を含む範囲。設定する3つのトリガーの1つは、次の就業日の終わりに自分自身を再度実行するトリガーであり、プロセスが再開されます。

これは約60%の時間で機能しており、残りの時間は失敗しています。私が見た限りでは、エラーの電子メールメッセージは生成されていません。

機能は以下の通りです。whileループは、スクリプトの実行時にスプレッドシートの値がGoogleClock()の再計算の最中にないことを確認することを目的としています。これは、スクリプトが失敗した理由についての私の最初の疑いでした。助言がありますか?

function setCustomRunTriggers() {
  Utilities.sleep(5000);
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("PushedSchoolHolidays");
  var nextMidnight = sheet.getRange('D3').getValue();
  var nextSeven = sheet.getRange('D4').getValue();
  var nextSevenOFive = sheet.getRange('D5').getValue();
  var type =  getType(nextMidnight);
  while (type!="Object") {
    nextMidnight = sheet.getRange('D3').getValue();
    nextSeven = sheet.getRange('D4').getValue();
    nextSevenOFive = sheet.getRange('D5').getValue();
    type =  getType(nextMidnight);
  }
  var triggers = ScriptApp.getScriptTriggers();
  for (var i = 0; i<triggers.length; i++) {
    var eventType = triggers[i].getEventType();
    var triggerSource = triggers[i].getTriggerSource();
    var handlerFunction = triggers[i].getHandlerFunction();
    if ((handlerFunction=='functionA')&&(eventType=="CLOCK")&&(triggerSource=="CLOCK")) {
      ScriptApp.deleteTrigger(triggers[i]);
    }
    if ((handlerFunction=='functionB')&&(eventType=="CLOCK")&&(triggerSource=="CLOCK")) {
      ScriptApp.deleteTrigger(triggers[i]);
    }
     if ((handlerFunction=='setCustomRunTriggers')&&(eventType=="CLOCK")&&(triggerSource=="CLOCK")) {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
  ScriptApp.newTrigger('functionA').timeBased().at(nextMidnight).create();
  ScriptApp.newTrigger('functionB').timeBased().at(nextSeven).create();
  ScriptApp.newTrigger('setCustomRunTriggers').timeBased().at(nextSevenOFive).create();
}
4

2 に答える 2

4

提供されたコードに次の問題が見られます

  1. 時間ベースのトリガー コードでSpreadsheetApp.getActiveSpreadsheetメソッドを使用する。トリガーが属するユーザーが開いているスプレッドシートを持っていないか、アクティブなスプレッドシートにシートがないPushedSchoolHolidays場合、コードは「null のメソッド "getSheetByName" を呼び出せません」などの例外をスローします。この問題を解決するには、 SpreadsheetApp.openByIdメソッドを使用する必要があります。
  2. メソッドは、getType5 分以上の間、"Object" とは異なる文字列を返します。スクリプト ホスティング コードが「最大実行時間の超過」例外をスローします。
  3. すべてのトリガーの実行時間が日トリガー集計実行時間の制限を超えています。

私が確認した限り、エラー メール メッセージは生成されていません。

プログラムで作成されたトリガーにはExecution failure notification電子メールがありません。エラーメールが届かない原因として考えられます。

于 2012-10-04T07:00:29.250 に答える
0

すべて (!) の newTrigger() を try/catch ブロックに配置し、catch ブロックに電子メール通知を入れることを学びました。これにより、newTrigger が失敗した場合 (たとえば、1 日あたりのトリガー制限に達したなど) に、フィードバックを受け取ることができます。

  try{
    ScriptApp.newTrigger('myFunction').timeBased().after(10000).create();
  } catch(error){
    MailApp.sendEmail("me@example.com", "NEWTRIGGER FAILED!", "Creating new time based trigger failed: \r\n" + error);
  }     
于 2016-03-07T14:06:22.200 に答える