5分以上かかる処理の実装について(タイムアウトエラー対策)

8,877 views
Skip to first unread message

山本 章

unread,
Dec 6, 2012, 3:29:59 AM12/6/12
to google-app...@googlegroups.com
お久しぶりです。
山本章です。
再度質問させてください。

Google Apps Scriptでは5分以上処理がかかった場合、サーバから「
起動時間の最大値を超えました」との
エラーが返されますが、こういった長い処理の実装はどのようにすればよろしいのでしょうか?

私が考え付く限りでは、5分に1回走るトリガーを用意しておき、その中で未処理分を取り出し、
未処理分のみ再実行をかけるという方法が思いつきます。

ただし、この場合ですと、毎日サーバからエラー報告メールで「起動時間の最大値を超えました」という
エラーが何度も発生しているというのがきますよね。

できればこのようなエラーを発生させないで実装したいのですが、いい方法があれば
ご教授ください。

よろしくお願いいたします。

山本章

Ohashi, Keisuke

unread,
Dec 6, 2012, 3:39:22 AM12/6/12
to google-app...@googlegroups.com
To 山本さん

大橋(soundTricker)です。

丁度昨日GAS Advent Calendarでそのネタ(が含まれているネタ)を書いたので見てみてください。


下の方に書いていて、
やっている方法は「スクリプト内で5分を計測して、5分立っていたらScriptApp.createTriggerで再起動する」という感じです。

山本さんが仰るように
5分に1回走るトリガーでやる方法もひとつの方法です。
この場合でも5分を計測して、途中でreturnしてしまうのがいいかと思います。




山本 章

unread,
Dec 6, 2012, 9:47:36 AM12/6/12
to google-app...@googlegroups.com
大橋さん

山本です。
ありがとうございます。
とても参考になりました。

参考ページにトリガーを削除する処理が省略されていましたが、以下のようなコードで合って
いますでしょうか?

  var triggerId = Number(ScriptProperties.getProperty("triggerId"));
  if(triggerId) {
    var triggerList = ScriptApp.getScriptTriggers();
    for(var i=0; i<triggerList.length; i++) {
      if(triggerList[i].getUniqueId() == triggerId) {
        ScriptApp.deleteTrigger(triggerList[i]);
      }
    }
  }
 

ScriptApp.getScriptTriggers() のところで、Unexpected exception upon serializing continuation という
エラーが出てしまい、正常に取れません。

よろしければご教授ください。
よろしくお願いします。

山本章


2012年12月6日木曜日 17時39分22秒 UTC+9 soundTricker:

Ohashi, Keisuke

unread,
Dec 6, 2012, 9:45:58 PM12/6/12
to google-app...@googlegroups.com
To 山本さん

大橋です。
コード的には合っていると思います。
多分最初のNumber(ScriptProperties.getProperty("triggerId"));のNumberのところは無くていい(getUniqueId()はStringを返却)のですが、
エラーが出る理由は不明です...

Triggerを登録し直すといいかもしれません...

一応自分が書いているやつだと以下の様な感じです。

function deleteTrigger(triggerKey) {
  triggerKey = triggerKey || "triggerId";
  var triggerId = ScriptProperties.getProperty(triggerKey);
  
  if(!triggerId) {
    return;
  }
    
  ScriptApp.getScriptTriggers().filter(function(trigger){
    //var trigger = ScriptApp.getScriptTriggers()[0];
    return trigger.getUniqueId() == triggerId;
  })
  .forEach(function(trigger) {
    ScriptApp.deleteTrigger(trigger);
  });
  
  ScriptProperties.deleteProperty(triggerKey);
}




2012年12月6日 23:47 山本 章 <af.yamam...@gmail.com>:
--
このメールは Google グループのグループ「Google Apps API Japan」の登録者に送られています。
このグループに投稿するには、google-app...@googlegroups.com にメールを送信してください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 

山本 章

unread,
Dec 15, 2012, 11:42:33 AM12/15/12
to google-app...@googlegroups.com
大橋さん

山本です。
ありがとうございます。

大橋さんのコードをコピペすると動きました。
またよろしくお願いいたします。

山本章


2012年12月7日金曜日 11時45分58秒 UTC+9 soundTricker:
このグループに投稿するには、google-apps-api-ja...@googlegroups.com にメールを送信してください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 

Reply all
Reply to author
Forward
0 new messages