ドライブのディレクトリコピーでのタイムアウト回避方法

565 views
Skip to first unread message

河城拓真

unread,
Apr 18, 2016, 1:40:34 AM4/18/16
to Google Apps API Japan
Apps Scriptでディレクトリごとバックアップを取るスクリプトを作成しました。
ですが、タイムアウトエラーにより、全てのファイルをコピーすることができません。色々検索した結果、トリガーをスクリプト内で設定し、タイムアウトエラーが出る前に再度スクリプトを続きから実行する方法を取ろうと思います。しかし、

1.スクリプトの実行開始からの経過時間の計測・およびその時点でトリガーを設定する方法
2.どこまでファイルのコピーが完了したかを保持し、トリガーで再度スクリプトを実行した時に途中からコピーを始める方法

がわかりません。コード提案などよろしくお願いします。
(関係ないと思いますが、一応念のため。Google Apps for Educationを利用しています)

soundTricker

unread,
Apr 20, 2016, 4:43:02 AM4/20/16
to Google Apps API Japan
かなりいろんなやり方があるのでなんともですが、
1.スクリプトの実行開始からの経過時間の計測・およびその時点でトリガーを設定する方法
に関しては手前味噌ですが、以下の記事を見ていただくとわかるかもしれません。

またトリガーを毎回発行する方法ではなく、例えば1分ごとのトリガーを用意しておき処理中であればスキップ、タイムアウトして処理中でなければ実行という方法もあります。
2も含めてコードを書くと以下の感じです。

function startTrigger() {
  //この関数を1日一回のクーロンなどで登録しておく
  
  //初期化とバックアップトリガーを設定
  PropertiesService.getScriptProperties().deleteProperty("fileContinuationToken");
  ScriptApp.newTrigger("backup").timeBased().everyMinutes(1).create();
}

function backup(){
  //バックアップ処理
  
  var lock = LockService.getScriptLock();
  
  //ロックを実施 = 処理中
  if(lock.tryLock(1000)) {
    // skip;
    return;
  }
  var prop = PropertiesService.getScriptProperties();
  
  //どこまで処理したかのToken
  var fileContinuationToken = prop.getProperty("fileContinuationToken");
  
  if(fileContinuationToken) {
    var files = DriveApp.continueFileIterator(fileContinuationToken);
  } else {
    var folder = DriveApp.getRootFolder();
    var files = folder.getFiles()
  }
  
  while(files.hasNext()) {
    //一つ処理する毎にトークンを保存しておく
    prop.setProperty("fileContinuationToken", files.getContinuationToken());
    
    var file = files.next();

    // doBackup
    // 実際のバックアップ処理
    
    // 一応スリープ
    Utilities.sleep(1000);
  }
  
  // トークンを削除
  PropertiesService.getScriptProperties().deleteProperty("fileContinuationToken");
  
  // backupのトリガーを削除
  endTrigger();
  
  // ロックを開放
  lock.releaseLock();
  
}

function endTrigger() {
  //バックアップトリガーを削除
  
  var triggers = ScriptApp.getProjectTriggers();
  
  for (var i = 0; i < triggers.length; i++) {
    var trigger = triggers[i];
    
    if (trigger.getHandlerFunction() == "backup") {
      ScriptApp.deleteTrigger(trigger);
    }
  }
}






2016年4月18日月曜日 14時40分34秒 UTC+9 河城拓真:
Reply all
Reply to author
Forward
0 new messages