GASでスプレッドシートに
SUMやIFなどの数式をコードで設定する方法
値そのものではなく、setFormulaで「=SUM(...)」のような数式をセルに埋め込む方法を解説します。列全体への一括設定、相対参照の量産、数式の読み取りと値への変換まで、動くコードで紹介します。
Table of Contents
setValueとsetFormulaの違い
GAS(Google Apps Script。Googleのサービスを自動化できるスクリプト)でセルに書き込む方法は大きく2つあります。setValueは計算結果の「値」を書き込み、setFormulaは「=SUM(A2:A10)」のような「数式そのもの」を埋め込みます。結論から言うと、参照先の値が変わったら自動で再計算させたいなら setFormula、計算済みの固定値を残したいなら setValue です。
setValue で書き込む
セルには結果の値だけが入る。参照元が変わっても再計算されない。共有・エクスポート向き。
setFormula で書き込む
セルには数式が残る。参照元が変わると自動で再計算。人が数式を確認・修正できる。
setFormulaで1セルに数式を入れる基本
まずは基本形です。getRange("D2").setFormula("=B2*C2")のように、対象セルに対して数式の文字列を渡すだけです。数式は必ず「=」で始めます。IF関数のように数式内で文字列を使う場合は、外側をシングルクォート、内側をダブルクォートにすると書きやすくなります。
function setBasicFormula() {
const sheet = SpreadsheetApp.getActive().getSheetByName("売上");
// D2 に「単価 × 数量」の数式を設定する
sheet.getRange("D2").setFormula("=B2*C2");
// 合計行に SUM を設定する(D2〜D11 の合計を D12 に)
sheet.getRange("D12").setFormula("=SUM(D2:D11)");
// IF で判定した文字を E2 に入れる
sheet.getRange("E2").setFormula('=IF(D2>=10000,"高額","")');
}セルに文字として「=」から始まる文字列を残したい場合(数式にしたくない場合)は、setValue("'=合計")のように先頭へシングルクォートを付けます。
setFormulasで列全体に一括設定する
行ごとに参照先が変わる数式(D2は=B2*C2、D3は=B3*C3…)を全行に入れたいときは、setFormulaを行数ぶんループで呼ぶと遅くなります。数式を二次元配列にまとめてsetFormulasで一括書き込みするのが基本です。読み書きの回数を減らすと処理が大幅に速くなります。
function fillColumnFormulas() {
const sheet = SpreadsheetApp.getActive().getSheetByName("売上");
const startRow = 2;
const lastRow = sheet.getLastRow();
const rowCount = lastRow - startRow + 1;
if (rowCount < 1) return;
// 各行の数式を二次元配列で作る(1列なので [ ["式"], ["式"], ... ])
const formulas = [];
for (let r = startRow; r <= lastRow; r++) {
formulas.push(["=B" + r + "*C" + r]);
}
// D2 から下に一括で書き込む(setFormula を行数ぶん呼ぶより速い)
sheet.getRange(startRow, 4, rowCount, 1).setFormulas(formulas);
}R1C1形式で相対参照を量産する
R1C1形式(行番号=Row・列番号=Columnで位置を表す書き方)を使うと、 全行で同じ1つの数式文字列を使い回せます。RC[-1]は「同じ行の1つ左のセル」を意味し、貼り付けた各行で自動的に相対参照になります。行番号を文字列連結する必要がなく、コードがすっきりします。
function fillWithR1C1() {
const sheet = SpreadsheetApp.getActive().getSheetByName("売上");
const startRow = 2;
const lastRow = sheet.getLastRow();
const rowCount = lastRow - startRow + 1;
if (rowCount < 1) return;
// R1C1 形式は「同じ行の2列左 × 1列左」を全行同じ文字列で表せる
// RC[-2] = 同じ行の2つ左の列, RC[-1] = 同じ行の1つ左の列
const range = sheet.getRange(startRow, 4, rowCount, 1);
range.setFormulaR1C1("=RC[-2]*RC[-1]");
}getFormulaで既存の数式を読み取る
セルに入っている数式を読み取るにはgetFormula、範囲まとめてはgetFormulasを使います。数式が入っていないセルは空文字("")が返るので、値と数式のどちらが入っているか判定できます。既存シートの数式を点検・移行するときに便利です。
function readFormulas() {
const sheet = SpreadsheetApp.getActive().getSheetByName("売上");
// 1セルの数式を読む(数式でなければ空文字が返る)
const one = sheet.getRange("D2").getFormula();
Logger.log(one); // 例: =B2*C2
// 範囲の数式を二次元配列でまとめて読む
const all = sheet.getRange("D2:D11").getFormulas();
all.forEach((row, i) => {
Logger.log((i + 2) + "行目: " + row[0]);
});
}数式を計算後の値に変換する
数式を含んだシートを外部に共有したり、参照先シートを消したりする前に、 数式を計算結果の値へ固定化したいことがあります。getValuesで計算後の値を取得し、同じ範囲へsetValuesで書き戻せば、数式が値に置き換わります。元には戻せないので、実行前のバックアップをおすすめします。
function freezeFormulasToValues() {
const sheet = SpreadsheetApp.getActive().getSheetByName("売上");
const range = sheet.getRange("D2:D11");
// getValues() は計算後の値を返す。それを同じ範囲に書き戻すと
// 数式が値に置き換わる(=数式が固定化される)
const values = range.getValues();
range.setValues(values);
}ARRAYFORMULAで数式を1つにまとめる
行が増えるほど数式の数も増え、再計算が重くなります。ARRAYFORMULA(範囲全体をまとめて計算する関数)を使うと、先頭セルに1つ数式を置くだけで列全体をカバーできます。GAS側からはsetFormulaで1セルに設定するだけ。行が増減しても数式を貼り直す必要がなく、フォーム回答で増え続けるシートと相性が良い方法です。
function setArrayFormula() {
const sheet = SpreadsheetApp.getActive().getSheetByName("売上");
// 見出しは2行目から、なのでヘッダー行(1行目)は空文字にしておく
// ARRAYFORMULA なら数式は D2 の1つだけで D列全体をカバーできる
sheet.getRange("D2").setFormula(
'=ARRAYFORMULA(IF(B2:B="","",B2:B*C2:C))'
);
}実務での注意点
1. 引数の区切りはカンマで書く
GASのsetFormulaはUS形式(カンマ区切り)で書くのが基本です。ファイルの地域設定によってはセミコロン区切りで表示されますが、コード上はカンマで問題ありません。うまく反映されないときは地域設定を確認しましょう。
2. 配列の形をセルの範囲と一致させる
setFormulasに渡す二次元配列の行数・列数は、対象範囲のサイズと必ず一致させます。ずれるとエラーになります。1列なら「[["式"], ["式"]]」のように各行を1要素の配列で包みます。
3. 数式を消したいときはclearContent
設定した数式を消すには、範囲に対してclearContent()を使います。書式は残したまま中身だけ消せます。値へ固定化したい場合は、前述のgetValues→setValuesを使い分けましょう。
まとめ
GASでの数式設定は、1セルならsetFormula、列全体ならsetFormulasが基本です。相対参照を量産するならR1C1形式、行の増減に追従させたいならARRAYFORMULAが便利です。 数式のまま残すか値に固定するかを目的に応じて使い分けることで、集計シートやレポートの自動化がぐっと楽になります。
よくある質問
setValueは計算結果の「値」をそのまま書き込みますが、setFormulaは「=SUM(A2:A10)」のような数式そのものをセルに埋め込みます。setFormulaで設定するとセルの中身は数式として残るため、参照先の値が変われば自動で再計算されます。あとで人が編集シート上で数式を確認・修正できる点もsetValueとの違いです。
なります。GASのsetValueやsetFormulaに「=」で始まる文字列を渡すと、スプレッドシート側で数式として解釈されます。ただし意図を明確にするため、数式を入れるときはsetFormula(またはsetFormulas)を使うことをおすすめします。逆に「=」で始まる文字列をそのまま文字として表示したい場合は、先頭にシングルクォートを付けます。
スプレッドシートの言語・地域設定によって、関数の引数の区切り記号がカンマ(,)ではなくセミコロン(;)になっている場合があります。GASのsetFormulaは基本的にカンマ区切りのUS形式で書けば動きますが、うまくいかない場合はファイルの地域設定を確認するか、区切りをセミコロンに変えて試してください。
getValues()で取得した計算結果を、同じ範囲にsetValues()で書き戻すと、数式が値に置き換わります。数式を含むシートを外部に共有する前や、参照先シートを削除する前に固定化したいときに使います。元に戻せない操作なので、実行前のバックアップをおすすめします。
行が増えるほど数式の数も増えて再計算が重くなります。1つのARRAYFORMULAで列全体をまとめて計算すると、数式は1つで済むため軽くなります。GAS側からは、先頭セルにsetFormulaでARRAYFORMULAを1つ入れるだけで列全体をカバーできます。行の増減に自動追従させたい列と相性が良い方法です。
GAS開発・業務Webシステムを
相談する。
集計シートの数式自動化のほか、帳票出力・フォーム連携・Gmail自動化など、日々の業務を自動化するGAS開発をご相談いただけます。