GASの制限について

331 views
Skip to first unread message

もんきち

unread,
Aug 2, 2020, 5:02:50 AM8/2/20
to Google Apps API Japan

お世話になります。

現在、以下のスクリプトを書き終えて、テストを行っています。


function myFunction() {
 
  var lock = LockService.getScriptLock();
    if (lock.tryLock(1)) {
      var start = new Date();
      var condition;
      condition  = " is:unread"  //未読
      condition += " has:attachment";  //添付あり
     
      var search_mail = GmailApp.search(condition);
      var messages = GmailApp.getMessagesForThreads(search_mail);
      
      var hozon_folder = DriveApp.getFolderById('GoogleドライブのフォルダID');
      for(const thread of messages) {
        for(const message of thread) {
          if (message.isUnread()) {
            var attachments = message.getAttachments();
            var day = message.getDate();
            var strDay = Utilities.formatDate(day , "JST", "yyyy_MM_dd_HH_mm_ss");
            for(const attachment of attachments) {
              var filename = strDay + '_' + attachment.getName();
              hozon_folder.createFile(attachment);
              var file = hozon_folder.getFilesByName(attachment.getName())
              file.next().setName(filename);
            }
            message.markRead();
            
            var end = new Date();
            var time_past = (end - start) / 1000;
            if (time_past > 240) {
              Logger.log("実行時間が規定の時間を経過しました。スクリプトを終了します");
              lock.releaseLock();
              return 0;
            }
          }
        }
      }
      Logger.log("正常に処理を完了しました。スクリプトを終了します");
      lock.releaseLock();
    } else {
      Logger.log("二重起動になります。スクリプトを終了します");
    }
}

仕様としては、未読のメールに添付されているファイルをGoogleドライブの
特定のフォルダに保存すると言った物です。

恐縮ですが、以下の点についてご教示いただければ幸いです。

1. このスクリプトにsleepを2行入れて10分間スリープするようにしスクリプトが
 タイムアウトするようにしました。タイムアウトまでの時間を計測したところ
   6分でタイムアウトしたとエラーが出力されています。Googleのquotasを参照
 したところ「 Script runtime 」が6分、「 Custom function runtime 」が30秒と
 規定されています。自作のPGなので「 Custom function runtime 」が適用され
 ると思っていたのですが、相違ないでしょうか?

2. 「 Triggers total runtime 」ですが、この制限値はトリガーにより起動された
 PGの処理の総時間と捉えて良いのでしょうか?また、その場合、制限値のリ
 セットが行われるタイミングは0:00(日付が変わるタイミング)であっています
 でしょうか?

お手数をおかけいたしますが、返信いただければ幸いです。
よろしくお願い致します。
Message has been deleted

hikochang

unread,
Sep 20, 2020, 9:59:49 PM9/20/20
to Google Apps API Japan
1.は「 Script runtime 」の6分だと思います。 Custom function runtime 」はスプレッドシートなどでセルの中から呼ばれる場合ではないでしょうか?

2.リセットされる時間は分かりませんが意味合いはそう言うことだと思います。無限ループのスクリプトを時間駆動のトリガーで動かしておくとエラーを見るといつ解除されるか分かります。テスト用のアカウントで実施した方が良いですね。

検索した結果から既読が未読かで処理を切り分けているのですね?間違えて手動で既読にするとアウトな感じですね。スレッド単位ではなくメッセージ単位でラベルをつける機能が欲しいですよね、、、
私は以下の様に時間で管理してます。

2020年8月2日日曜日 18:02:50 UTC+9 もんきち:
Reply all
Reply to author
Forward
0 new messages