質問: 15;i <17;i++){ Array[16] =sheet.getRange("J" + i).setFormula("=if(sum(" + "K" + i + ":" + "NK" + i + ")=0,\"\",sum(" + "K" + i + ":" + "NK" + i + "))"); } sheet.sheet.getRange().setFormulas(Array); }
回答: 修正されたコードについていくつか。 1. 基本的にはセルごとに処理をしているので時間がかかっています。 連続したセル(行や列も含め)単位で、まとめて処理できる部分はまとめましょう。 そうすれば多少は改善すると思いますよ。 特にfor文中で都度、`getRange()`、`setFormula()`を実行していますが、処理遅延・負荷の原因となります。 (そもそも2回しか回していないようですので、そこは`setFormulas()`でまとめて処理したほうが良いでしょう) 2. 変数の文字列中、`String.fromCharCode(10)`として+演算子で連結されていますが、視認性が悪いですよね。 つまりメンテナンスしづらい。 そこは「\n」で良いと思いますが、そのように記述した意図があるのでしょうか。 3. Arrayに処理結果をセットしていますが、その後のArrayの状態をイメージできていますか? ほとんどが当該シートの当該セルに対して処理を行った後、Rangeオブジェクトをセットしていますが、無駄な処理ですよね。 恐らく最後でまとめて処理したつもりかと思います。 タイムアウトがなかったとしても、最後でエラーが出ますね。 ただし、期待している結果が出た後なので「???」と思うかもしれませんけど。 初心者申告されたご質問でしたので、最低限の修正をしました。 setValue()とsetValues()、setFormula()とsetFormulas()の違いなどはおさえたほうが良いでしょう。 なお、動作確認などはしておりませんので参考までに。 特に数式に関しましては再確認してくださいね。 ``` function 工数表() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName('工数表'); var zyutakumae = "仕様書確認\n"+ "情報収集\n"+ "ページネーション\n"+ "社内MTG\n"+ "組み手MTG\n"+ "企画書作成\n"+ "書類作成\n"+ "コンペ\n"+ "雑務\n"+ "その他"; var zyutakugo = "キックオフMTG\n"+ "社内MTG\n"+ "組み手MTG\n"+ "実行(納品)\n"+ "書類作成・提出\n"+ "雑務\n"+ "その他"; var before_day = "コンペ日\n入札日"; var after_day = "履行日"; var ave = sheet.getRange("C15:C16"); sheet.insertRowsBefore(15,2); sheet.getRange(15, 3, 2, 7) //C15:I16までをまとめて背景処理 .setBackgrounds([ ["#FFFCDB","#ffffff","#ffffff","#FADBDA","#ffffff","#ffffff","#FFFCDB"], ["#ffffff","#ffffff","#ffffff","#D3DEF1","#ffffff","#ffffff","#ffffff"] ]); ave.setBorder(true,true,true,true,true,true); //sheet.getRange("A:A").setNumberFormat("yyyy/MM/dd"); //←この処理はシートに直接設定すれば良い sheet.getRange(15, 1, 2, 1).setNotes([[before_day],[after_day]]); //A15:A16にメモ挿入 sheet.getRange("B15:B16) .setFormulas([ ['=if(or(A15="",today()>A15),"",NETWORKDAYS(today(),A15,reference!$B$2:$B$30))'], ['=if(or(A16="",today()>A16),"",NETWORKDAYS(today(),A16,reference!$B$2:$B$30))'] ]); sheet.getRange(15, 4, 1, 2) .setFormula([ ['=if(OR($C15="",$C15<10006,$C15>700000),"",vlookup($C15,'自治体リストDB'!$B$4:$H$3000,6,false))', '=if(OR($C15="",$C15<10006,$C15>700000),"",vlookup($C15,'自治体リストDB'!$B$4:$H$3000,7,false))'] ]); sheet.getRange(15, 6, 2, 1) .setValues([ ["受託前"], ["受託後"] ]) .setNote([ [zyutakumae], [zyutakugo] ]); sheet.getRange(16,9).setValue("同上"); sheet.getRange("J15:J16") .setFormula([ ['=if(sum(K15:NK15)=0,"",sum(K15:NK15))'], ['=if(sum(K16:NK16)=0,"",sum(K16:NK16))'] ]); //sheet.sheet.getRange().setFormulas(Array); //不要というより意味不明ですよ } ```