web-dev-qa-db-ja.com

Google Apps Scriptで「1秒間に何度も呼び出される」エラーを防止する

各タブに異なる月で構成されるGoogleスプレッドシートがあります。毎月、新しいタブと別の50〜75行を追加します。多くのタブがあります。次のように、各行にカスタム関数を呼び出すセルがあります。

=myFunction(A1)

私が抱えている問題は、次のエラーが表示されることです。

エラー:このGoogleユーザーアカウントに対してスクリプトが1秒間に何度も呼び出されました。

このエラーの発生を防ぐにはどうすればよいですか?

タブが多すぎる、またはタブごとの行が多すぎるために問題がありますか?

関数が複数回実行されることを防ぐ方法が必要です。


呼び出される関数の短縮バージョンは次のとおりです。

function myFunction(expense) {
if (
  InStr(1,expense,"CPC SCP") ||
  InStr(1,expense,"CPC/SCP") ||
  InStr(1,expense,"xxxx")
  )
  { category = "5530 - Postage Expense" } 

  else if (
  InStr(1,expense,"PRE-AUTHORIZED PAYMENT") ||
  InStr(1,expense,"xxx ")
  )
  { category = "9999 - Payment" } 

  else if (
  InStr(1,expense,"PURCHASE INTEREST") ||
  InStr(1,expense,"RETURNED PAYMENT FEE") ||
  InStr(1,expense,"xxxx")
  )
  { category = "5070 - Bank Charges" } 

else { category = "Not Sure" }

return category;  

} 
2
DanielAttard

より良いのは、個々のセルを処理する代わりに、範囲の結果を準備することです。ファイルを開くとき、すべてのセルを個別に処理する必要があります。これは、最終的に、エラーを引き起こしました。したがって、以下のコードを作成しました。

コード

function catExp_1(range) {
  var output = [], arr = JSON.parse(createArr());
  for(var j=0, jLen=range.length; j<jLen; j++) {
    var result = "Not Sure";
    for(var i=0, iLen=arr.length; i<iLen; i++) {      
      for(var k=0, kLen=arr[i][1].length; k<kLen; k++) {        
        if(range[j][0].indexOf(arr[i][1][k]) != -1) {
          result = arr[i][0];
        }
      }      
    }
    output.Push([result]);
  }
  return output;
}

function createArr() {
  // check for availability
  var cache = CacheService.getPublicCache();
  var cached = cache.get("accounts");
  if (cached != null) {  
    return cached;
  }

  // create array
  var arr = [    
    [["5070 - Bank Charges"],["PURCHASE INTEREST", "xxxx"]],
    [["5530 - Postage Expense"],["CPC SCP","xxxx"]],
    [["9999 - xxxxxxx"],["xxxxxxxx"]]
  ];

  // add to cache
  var jsonData = JSON.stringify(arr);
  cache.put("accounts", jsonData, 21000);
  return jsonData;
}

説明した

最初のスクリプトは出力配列を作成し、ルックアップデータを収集します。これはキャッシュに保存されるか、オンザフライで準備されます(そして次回キャッシュに保存されます)。反復はカテゴリNot Sureで始まります。一致が見つかった場合、対応する値は出力配列にプッシュされます。それ以外の場合は、Not Sureが追加されます。

使用法

=catExp_1(B2:B133)

注意

カテゴリを検索するのではなく、カテゴリを追加することを検討してください。これにより、スクリプトの遅延がなくなります。これを行うメニュー項目を簡単に作成できます。

1