複数系の穴

佐野

佐野 2013年3月27日

GoogleAppsに限った話でもないかもしれませんが、
関数名の中には、複数系と、そうでないものがあります。

まず、スプレッドシートの内容を全て取得し、
その内容を編集し、それを丸ごとシートに戻すという作業を行っています。

一見問題もなく、実際動かしてもエラーは出ませんが、
このスクリプトで更新されたシートは、このようになります。

なんか、とんでもない事になっておりますが、
全セルの内容が、1つのセルに押し込まれているという状況です。

「getRange()」関数で、シートのセルを指定、
今回の場合は、全体を複数選択するようにしています。
そして、「setValue()」関数により、編集した内容を挿入するのですが、
じつは、この関数名がクセモノ。
「setValue()」は、ひとつのセルに対して内容を挿入する関数です。
つまり、全体のセル1個1個に、シート全体の内容が押し込まれた状態になっています。

そして、それを直した結果がこれです。

「setValues()」と複数系にする事で、複数の値を入れるための関数になりました。

複数系(語尾にsを付ける)にするかどうかで、関数の意味も変わってくるんですね。
これはまだ、実際にシートを確かめればいいのでわかりやすく、
たいした事ではないのですが、他の関数においても、
複数系かどうかで機能が変わってくるものがあります。

つい先ほどまで混乱していたのが、「insertColumnAfter()」という関数です。
これは指定した列の右側に対して、列を挿入する関数で、
第二引数を入れる事によって、複数列を挿入できるはずなのですが、
なぜかエラーが出てしまいました。

スプレッドシートの指定の仕方に問題があったのか?
しかし、ちゃんとコード補完には出ている・・・
そして、挿入すべき引数の内容も、数値で合っている・・・
なぜかと迷っていると、ようやくわかったのが、
これこそ複数系でなければならなかったのです。
「insertColumnsAfter()」
これが正しい関数です。

前者は、1列のみを挿入する関数なので、第二引数自体が存在しません。
複数の列を挿入するという機能を持った後者でなければ、ならなかったのです。
エラーは出てはいたのですが、「メソッドが見つからない」というだけなので、
詳しい状況がわからず、かなりハマっていました。

関数によっては、引数の数や型(文字列か数値かなど)によって、
機能を分けてくれる柔軟なものも存在しますが、
こういう融通の利かない関数も存在します。
むしろ、このタイプのほうが多いです。

ついでに、この関数を使ってシートを広げたりする場合、
内容を再度挿入する場合にも、
取得した配列の大きさと、「getRange()」で指定する範囲とが、
完全に一致していなければ、これまたエラーが出ます。
配列の方が広い場合なら、まだわかりますが、
配列の方が狭い場合であっても、エラーになります。
先述の画像では、全範囲を指定していますが、
シートの大きさを変えた場合は、改めて取得しなおすか、
範囲指定を配列の長さを取得するなどで、
両者を一致させておくと、いいかもしれないですね。