0

私は、結婚式の招待応答スプレッドシートの rsvps をカウントするための簡単な Google スクリプトを作成しようとしています。新しいエントリがスプレッドシートに追加されると、スクリプトは 1 週間完全に機能し、その後、各セルに次のエラー メッセージが表示されて突然機能しなくなりました。

エラー: サービスがタイムアウトしました: Apps Script

スクリプト自体は単純です。関連する列 (複数のイベントがあります) を照会し、ユーザーが指定した応答 (通常は "YES"、"NO"、または空白) があるかどうかを確認します。

このエラーはどういう意味ですか?また、修正のための提案はありますか?

function sumRSVP(response, rsvpType) {
  var rsvpCol = 7;
  if (rsvpType == "rehearsal") rsvpCol = 8;  
  if (rsvpType == "brunch") rsvpCol = 9;

  var mySum = 0;

  var sh = SpreadsheetApp.getActiveSheet();
  for( i=2; i<177; i++){

    var rsvp = sh.getRange(i, rsvpCol).getValue();
    var nguests = sh.getRange(i, 6).getValue();
    if(nguests != "" && rsvp == response){
      mySum = mySum + parseFloat(nguests);
    }
  }

  return mySum;
}
4

1 に答える 1

4

結婚式がうまくいきますように。これは少し前に質問されましたが、この投稿で 300 回以上閲覧されており、重要であると考えています。

ループ内でスプレッドシートからデータを抽出しないでください。必要なデータはバッチで配列に抽出し、配列をループで評価する必要があります。

次のドキュメント リファレンスを参照してください: https://developers.google.com/apps-script/guide_common_tasks#OptimizeScripts

読み取りと書き込みの回数を最小限に抑えることで、組み込みのキャッシュを最大限に活用するスクリプトを作成できます。交互の読み取りコマンドと書き込みコマンドは低速です。スクリプトを高速化するには、1 つのコマンドですべてのデータを配列に読み取り、配列内のデータに対して任意の操作を実行し、1 つのコマンドでデータを書き出します。

function sumRSVP(response, rsvpType) {
  var rsvpCol = 7;
  if (rsvpType == "rehearsal") rsvpCol = 8;  
  if (rsvpType == "brunch") rsvpCol = 9;

  var mySum = 0;

  var sh = SpreadsheetApp.getActiveSheet();
  // start at row 2 - uses columns 6-9
  var data = sh.getRange(2, 6, 177 - 1 , 4).getValues();
  for(var i=0; i<data.length; i++){

    var rsvp = data[i][rsvpCol - 6];
    var nguests = data[i][0];
    if(nguests != "" && rsvp == response){
      mySum = mySum + parseFloat(nguests);
    }
  }

  return mySum;
}
于 2012-05-11T20:46:01.607 に答える