Google Apps Script(GAS)でソースを書いていると見る警告を今回ご紹介させていただけたらと思います。主にGoogle Apps Script(GAS)の標準で提供しているgetRange().getValue()を頻繁に利用していると使いすぎですと警告がでてきます。
上記のエラーが出てきた時の具体的に対処方法について簡単にご紹介をさせていただきます。また今からGoogle Apps Script(GAS)を勉強し始めようと思っている人も記述途中で表示されると書き直す必要がでてくるために、先にお目通しいただけますと幸いです。
※2020年7月時点の確認でエラー文言が「起動時間の最大値を超えました」に変更となっておりました。

※2020年7月確認時のエラー文言は下記になっておりました。

どうやったら警告されるのか
Range.getValue の使用頻度が高すぎます。と表示される場合、主にはfor文を記述している内部処理にgetRange().getValue()を組み込んでいると表示されるの間違いなしです。
なんで表示されるのかというとGoogle Apps Script(GAS)の提供しているgetRangeは内部処理でスプレッドシートのAPIを叩いて取得しにいっているようで叩きすぎると怒られます。
じゃそんなメソッド提供すんなやって聞こえてきそうですが、そういうもんなんだと一旦咀嚼してもらい対処法をご紹介させていただきます。
まずは警告を簡単に表示させるスクリプトを下記に記載します。
この記述で簡単に表示することができます。それでは具体的な対処方法を下記で紹介してきます。
対処法
上記で紹介したソースコードリファクタリングします。
データ格納方法
処理はたった3行で先程の処理を内包させることができます。getDataRange().getValues();を行っていただくことで現在シートに記載されている内容をすべて2次元配列としてvaluesに一気に格納することができます。
実際に格納されていたデータをソースコード上で利用したい場合は下記のコードで呼び出すことができます。
格納データの呼び出し方法
Logger.logはGoogle apps scriptのデバッグ等ログを吐き出して確認したいときのメソッドになります。cmd+Enter(windowsの場合、ctrl+Enter)でログの確認をすることができます。
valuesは全データが2次元配列で格納されているので他言語同様に格納先を0から指定してもらえれば配置されているデータを取得することができます。
とても簡単です。valuesは[列][行]の順で格納されているので中身を変更して確かめてみてください。
次にデータをセルにセットする方法を紹介してきます。
セルにデータをセットする方法
データのセットには結局getRangeを使ってしまいます。が、2次元配列をsetValuesで渡すことができるため、呼び出し回数としてはかなり圧縮できます。
またソースをみていただくと分かる通り、getRangeで範囲指定が可能なため、for文回してインクリメント格納みたいことをせず、2次元配列を作成して最後の処理に上記ソースを1行追加すればスマートになります。
【参考】汎用クラス
下記のgithubでも公開させていただきましたが、上記のスプレッドシート操作についてクラス化したため、利用してみてください。
https://github.com/nullpointlab/gasClass
またGoogle Apps Script(GAS)のクラス化については前回記事にしているため、よろしければ一読ください。
上記のtest()メソッドは呼び出した時にどのような挙動をするのかをイメージしていただくため、適当に記述してます。
まとめ
いかがだったでしょうか。今回の「Range.getValueの使用頻度が高すぎます」問題はぐぐるといろんな方がハマっているので皆様のお役に立てれば幸いです。