スプレッドシートのスクリプトがパワーアップ!

佐野

佐野 2014年2月26日

今まで、スクリプトでスプレッドシートを操作する際、
まず全シートの情報を二次配列で取得し、
その配列の中身を処理したうえで、戻すという作業が主な方法でした。
それは、1セルずつ要素を入力していく方法では、
大量の情報を扱う処理においては、
スプレッドシートにアクセスするための処理に時間がかかり、
結果、タイムアウトなどが発生する可能性があるからです。

しかし最近気付いたのですが、
その常識が覆されるようになってきたかもしれません。

たとえば・・・

20140226145942

このように、全セルを1セルずつ更新していく方法は、
まず取るべきではありませんでした。
そう、今までは・・・

ですが、驚くべき事に、この処理も今では可能となってしまいました。

20140226151733

このように1000行26列もあるシートであろうとも、処理できるようになっていました。

もうひとつ、うれしい事は、
ないはずのセルに対して、「setValue()」を行っても、
新しい行や列を作ってくれるというところ。

20140226150809

以前までならエラーになり、シートのサイズを考慮しての処理も必要だったのですが、
このおかげで、エラーによってシステムが強制終了される可能性も、大幅に減ったともいえます。

ただ、最大行や列を超えた範囲に対して更新を行うという事は、
本来入力すべき場所と、ズレている可能性もあるという、
スクリプトの問題面も無視する事はできない点には注意が必要でしょう。

ただし、スプレッドシートに反映されるのは、
スクリプトの処理が、完全に終了してからになっているもようです。
今回の件に気が付いたのは、デバッグモードでブレークポイントで処理を止めると、
その間に通過した「setValue()」処理が反映されない事からです。
おそらくは内部で処理すべき情報をため込んでおき、
スクリプト終了時にスプレッドシートへの反映を行っているのでしょう。

多くのリファレンスにおいては、まず「getValues()」で二次配列として取得し、
「setValues()」で全セルを一括更新という形ではなく、
「setValue()」という1セルずつ更新する関数を使用しており、
処理の効率まで配慮されている記事は、意外と少ないため、
それに気付かず「setValue()」を用いた手段を多用する人もいるでしょう。
かくいう私も、かつてはそうでした。
その手段にも対応できる柔軟さも持ち合わせたとも思います。

ただ、1セルずつ更新する方法は、二次配列による全セル更新とちがって、
別のセルにも影響を与えにくいという利点もありますが、
扱う情報が大量になってくると、それでも処理が重くなる事は考えられます。
いずれにせよ、処理の重さも考慮した手段は必要になるでしょう。