2

新しい Docslist Tokenget*ForPaging()オプションが利用可能になったことに注意しますが、任意に大きなファイル/フォルダー ツリーの「すべてのファイルとフォルダー」を処理するアルゴリズムにまだ苦労しています。

n 個のファイルとフォルダーを持つ Google ドライブ ベースの Web ファイル システムを想定します。Google Apps Script を使いこなすには、6 分間を複数回実行する必要があります。毎晩、開始フォルダーの下にあるサブフォルダーのツリーで 30 日以上経過したすべてのファイルを処理する必要があります。各ファイルを一度だけ処理する必要があります (ただし、私の関数はべき等であるため、ファイルに対して再度実行してもかまいません)。

再帰アルゴは機能していますが、欠けているのは、スクリプトを呼び出すたびにフォルダー ツリーの一番上から開始する必要がないように、プレースホルダーを使用する方法です。6 分で処理できるのは、数百のフォルダーと数千のファイルだけです。

私の質問は、保存できるインデックスと、次回中断したところから開始する方法です。

トークンまたは最後に完了したフォルダー パス "/mytop/sub4/subsub47/" を保存することを考えましたが、それは別の呼び出しでどのように役立ちますか? 私がそこから始めた場合、そこから誤ってツリーをたどり、兄弟と祖先のフォルダーを見逃すことになります。

「検索」メソッドと「before:2012/10...」スタイル検索の使用について考えましたが、それをツリー内のファイル (単一フォルダーのみ) に制限する方法はありません。

コードは標準の再帰的な getFolders/getFiles であり、実際には質問の核心とは関係がないため、貼り付けていません。

4

1 に答える 1

3

作業しなければならないフォルダーの配列を作成し、将来の実行のためにすべて保存します。一部のファイル/フォルダーで繰り返し作業しても問題ないとおっしゃったので、関数に偽の停止を入れる必要さえありません。毎回タイムアウトさせることができます。

このようなもの:

var folders = null;

//call this to start the process or set the property manually
function start() {
  folders = ['id-of-the-starting-folder'];
  work();
}

//set this to run on the trigger
function work() {
  if( folders == null )
    folders = ScriptProperties.getProperty('folders').split(',');

  while( folders.length > 0 ) {
    workOnFolder(folders[0]);
    folders.shift(); //remove the 1st element
    ScriptProperties.setProperty('folders', folders.join());
  }
  //remove the trigger here
}

function doFolderLater(folder) {
  folders.push(folder.getId());
}

function workOnFolder(id) {
  var folder = DocsList.getFolderById(id);
  folder.getFolders().forEach(doFolderLater);
  folder.getFiles().forEach(workOnFile);
}

function workOnFile(file) {
  //do your thing
}
于 2012-11-06T10:35:22.653 に答える