pleiovain
@pleiovain

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

特定の処理の際にタイムアウトになる

閲覧ありがとうございます。

タイムアウトの解消がしたい

GoogleAppsScript で在庫管理をしており、未販売分を抽出して「●●日未販売分」というシートにまとめるスクリプトを書いており、実際に業務に使用しておりました。
元々全くエラーを吐いていませんでしたが、いつからか実行すると特定の処理の際にタイムアウトするようになりました。
解決方法を教えていただけますと幸いです。
よろしくお願いいたします。

発生している問題・エラー

Exception: ドキュメント(#######)にアクセス中に スプレッドシート のサービスがタイムアウトしました。(行 28、…)

ドキュメントのidはgetActiveSpreadsheetで取得したアクティブなスプレッドシートのidです。

「●●日未販売分」シート(コード上ではzaikoシートと表記)がないとき問題なくすべての処理を完遂するのですが、
「●●日未販売分」シートがあり、一度そのシートを削除して改めて作成した際に数秒でタイムアウトになります。

該当するソースコード

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getActiveSheet();
  var day = new Date().getDate();

  //すでにzaikoシートが追加されている場合
  try{
    var zaiko = ss.getSheetByName(day + '日未販売分');
    //tryの部分 zaikoシートが無ければ動かずエラーになる為catchへ
    zaiko.setColumnWidth(1, 230);
    //zaikoシートがあれば削除して取得するか確認
    var result = Browser.msgBox(day + '日未販売分シートを削除して取得しますか?',Browser.Buttons.YES_NO);
    if(result == 'no'){
      Browser.msgBox(day + '日未販売分シートの名前を変更して再度実行してください');
      return;
    }else if(result == 'yes'){
      //zaikoシート削除
      ss.deleteSheet(zaiko);
    }
  }catch(e){
  }
  //今回の未販売分のビットを張り付けるシートを作成
  ss.insertSheet(day + '日未販売分');
 ////問題の発生している行(行 28)
  var zaiko = ss.getSheetByName(day + '日未販売分');

自分で試したこと

・問題の発生している行をコメントアウト
 →その次の行でタイムアウト
・deleteSheet削除
 →タイムアウトは起きない(ss.insertSheet(day + '日未販売分');にて名前が被るためエラー)
 →deleteSheet起因?
・共有しているPCをすべてログアウトして実行
 →事象変わらず
・同じエラーの記事(https://teratail.com/questions/320623 )を参考に行数を削除
 事象変わらず

よろしくお願いいたします。

1

2Answer

慣れていないので、ベタ打ちで失礼します。

シートを削除する必要がないのではないでしょうか?.insertSheet()は自分もかなりエラーを吐かれることがあったので、
代わりにシートをクリアするメソッドを使用しましょう。

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getActiveSheet();
var day = new Date().getDate();

var sheetName = day + '日未販売分';

var zaiko = ss.getSheetByName(sheetName);
if (zaiko) {//sheetがあれば
zaiko.setColumnWidth(1, 230);
var result = Browser.msgBox(day + '日未販売分シートを削除して取得しますか?', Browser.Buttons.YES_NO);
if (result == 'no') {
Browser.msgBox(day + '日未販売分シートの名前を変更して再度実行してください');
return;
} else if (result == 'yes') {
zaiko.clear();
}
}else {//nullなら
zaiko = ss.insertSheet(sheetName);
}

Shift+Alt+Fで成形してください。

これでどうでしょうか?!
解決することを祈ります。。

0Like

Comments

  1. @pleiovain

    Questioner

    回答ありがとうございます!
    おかげさまで現在は問題なく復旧しています。
    確かに冷静になって考えてみれば.clearの方が絶対速いですね。

    ただ、一応作成してから半年ほどは何も問題なく動いていましたので何起因で発生しているのか気になります…

もともと動いていたものが急に動かなくなった、という部分が心配ですね。
処理以前に、何かしら上限に引っかかってないかを疑います。
たとえばシート数が上限の100まで達しているとか。

あと細かい部分ですけど、
同じvar宣言って複数回しても大丈夫でしたっけ?
(var zaiko)

0Like

Comments

  1. @pleiovain

    Questioner

    回答ありがとうございます!
    質問の意図が分かりづらくて申し訳ありません。

    おっしゃる通り処理やコードというよりはシート数(さすがに多くても10シートほどしか使用しません)ですとか何かの設定やアプデ、処理しにくいものなどが知れたらと思い質問いたしました。

    今回ですと上記コードで必ず即タイムアウトしました。
    insertSheetやdeleteSheetなどシート系触ると怪しいと推測していますが、
    原因がわからないため納得はできていません…
    もし今後本当にシートの追加や削除を行いたいときに使えない可能性のある状況なので…

    とりあえず現在は問題なく復旧していますが。

    constだとできなくて面倒なので、varにして複数宣言しています…
    const使え~ってよく言われますが、、

Your answer might help someone💌