各タブに異なる月で構成される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;
}
より良いのは、個々のセルを処理する代わりに、範囲の結果を準備することです。ファイルを開くとき、すべてのセルを個別に処理する必要があります。これは、最終的に、エラーを引き起こしました。したがって、以下のコードを作成しました。
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)
カテゴリを検索するのではなく、カテゴリを追加することを検討してください。これにより、スクリプトの遅延がなくなります。これを行うメニュー項目を簡単に作成できます。