前提・実現したいこと
スプレッドシート初心者でスクリプトを書くのも初めてですのでわかりにくい所あるかもしれませんがよろしくお願いします。
指定シートの指定範囲内の串刺し演算を行いたいです。
作ったソースコードでは時間内に処理ができずもっと簡潔にする必要があるのですが、その方法がわかりませんので、ご教授いただきたく思い投稿させていただきました。
シートが「集計」「マスタ」「テンプレ」「2018.7.29」「2018.7.28」・・・のように続いていきます。
日付の書かれた左から3枚目のシートから最後尾のシートまでの「q3:v11」「x3:x12」「q15:v23」「x15:x24」の範囲を「集計」シートに串刺し演算で合計。ということをしたいと考えています。
日付シートは日々追加されていくのでそのタイミングで実行し集計していく形となります。
発生している問題・エラーメッセージ
エラーメッセージ 「スクリプトによるメソッド Range.getValue の使用頻度が高すぎます」
該当のソースコード
ソースコード function calc_function() { var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets(); const erea1_start = "Q3"; const erea1_end = "V11"; const erea2_start = "X3"; const erea2_end = "X12"; const erea3_start = "Q15"; const erea3_end = "V23"; const erea4_start = "X15"; const erea4_end = "X24"; const erea_start = "Q3"; const erea_end = "X24"; for(var i = 2; i < sheets.length; i++) { for(var col = sheets[i].getRange(erea_start).getColumn(); col <= sheets[i].getRange(erea_end).getColumn(); col++){ for(var row = sheets[i].getRange(erea_start).getRow(); row <= sheets[i].getRange(erea_end).getRow(); row++){ if( ((sheets[i].getRange(erea1_start).getColumn() <= col && col <= sheets[i].getRange(erea1_end).getColumn()) && (sheets[i].getRange(erea1_start).getRow() <= row && row <= sheets[i].getRange(erea1_end).getRow())) || ((sheets[i].getRange(erea2_start).getColumn() <= col && col <= sheets[i].getRange(erea2_end).getColumn()) && (sheets[i].getRange(erea2_start).getRow() <= row && row <= sheets[i].getRange(erea2_end).getRow())) || ((sheets[i].getRange(erea3_start).getColumn() <= col && col <= sheets[i].getRange(erea3_end).getColumn()) && (sheets[i].getRange(erea3_start).getRow() <= row && row <= sheets[i].getRange(erea3_end).getRow())) || ((sheets[i].getRange(erea4_start).getColumn() <= col && col <= sheets[i].getRange(erea4_end).getColumn()) && (sheets[i].getRange(erea4_start).getRow() <= row && row <= sheets[i].getRange(erea4_end).getRow())) ) { if(i == 2){ sheets[0].getRange(row, col).setValue( 0 ); }else{ sheets[0].getRange(row, col).setValue( sheets[0].getRange(row, col).getValue() + sheets[i].getRange(row, col).getValue() ); } } } } } return 0; }
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー