関数を設定する
続いて、スクリプトによる関数の設定についてです。Googleスプレッドシートでは、各セルに関数を設定して自動計算させることが可能でした。セルを選択し、「挿入」メニューの「関数」から使用したい関数を選択することで、そのセルに関数の結果を表示させることができました。この「セルへの関数の設定」は、スクリプトから行うことも可能です。
セルへの関数の設定は、Rangeオブジェクトの「setFormula」メソッドを呼び出して行います。これは、引数に関数のテキストを渡すことで、そのRangeのセルに関数を設定するものです。実際の利用例をあげましょう。
function setFunc(){ var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); sheet.getRange(1,1).setFormula("=TODAY()"); }
これは、A1セルにTODAY関数を設定するものです。これを実行すると、A1セルに今日の日付が表示されるようになります。セルをダブルクリックして、TODAY関数が設定されていることを確認してみるとよいでしょう。
setValueでも関数設定可能?
Googleスプレッドシートの関数は、値と同じように設定をします。数値などを記入する代りに、「=関数名」と記述すると、自動的に関数として認識されるようになります。扱いが関数も普通の値と同様であるため、「なら、わざわざsetFormulaなど用意しなくとも、setValueで関数のテキストを設定すればいいのでは?」と思うかも知れません。
ところが、これはうまくいきません。TODAY関数などのように単独で使うものはsetValueでも問題なく動くのですが、引数にセルの指定などを行う場合、setValueでは問題を起こすことがあります。例えば、このような場合です。
function setFunc(){ var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); sheet.getRange("A10").setValue("=SUM(A1:A9)"); }
ここでは、A10セルに"=SUM(A1:A9)"と関数を設定しています。が、実際にやってみると分かりますが、セルには「#NAME?」とエラーが表示されてしまいます。念のためにセルをダブルクリックして設定されている値をチェックすると、「=SUM(A1:A9)」と正しく設定されています。それでもなぜか関数が機能しないのです。
function setFunc(){ var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); sheet.getRange("A10").setFormula("=SUM(A1:A9)"); }
このように実行すると、今度は問題なく動きます。設定される値はどちらもまったく同じなのですが、setValueでは動かず、setFormulaではきちんと動くのです。どうやら、関数の引数にセルの指定を行う際、単に"A1:A9"といったテキストだけでなく、内部的に何か別の処理をしているのかも知れません。setValueではそうしたことが行われないため、関数設定についてはsetFormulaを使うようにされている、ということなのでしょう。