【GAS】「スプシが重いからGASにする」は要注意!関数を移行する際の「落とし穴」5選 🕳️
Googleスプレッドシートを使っていると、データが増えるにつれて「再計算が終わらない」「動作がもっさりする」という問題に直面しますよね。
そんな時、多くのエンジニアが考えるのが
「関数(数式)をやめて、GAS(Google Apps Script)で値を直接書き込もう!」
という解決策です。
確かにGAS化は高速化の王道ですが、スプシの関数とプログラミング言語(GAS)は「似て非なるもの」 です。
安易に移行すると、「逆に遅くなった」「データが壊れた」という悲劇を招きます。
今回は、スプシ関数をGASへ移行する際にハマりやすい 「5つの落とし穴」 とその対策を解説します。
🕳️ 落とし穴1:getValue / setValue の連打で爆死する
関数からの移行で初心者が一番やってしまうミスがこれです。
❌ ダメな例(1セルずつ処理)
関数はセルごとに計算するので、GASでも同じように書いてしまいがちです。
// 1000行処理する場合
for (let i = 1; i <= 1000; i++) {
let val = sheet.getRange(i, 1).getValue(); // データを取得
let result = val * 2;
sheet.getRange(i, 2).setValue(result); // 書き込み
}
これだと、スプレッドシートとGASのサーバー間で2000回の通信が発生します。
スプシ関数なら一瞬なのに、GASだと数分かかる…なんてことになりかねません。
✅ 正解:配列で一括処理
GASの鉄則は「読み書きは1回ずつ」です。
// 一括取得
let values = sheet.getRange(1, 1, 1000, 1).getValues();
let results = [];
// メモリ上で計算
values.forEach(row => {
results.push([row[0] * 2]);
});
// 一括書き込み
sheet.getRange(1, 2, 1000, 1).setValues(results);
🕳️ 落とし穴2:「Ctrl + Z」で元に戻せない
これは運用上の最大の恐怖です。
-
関数(数式): 間違えても
Ctrl + Z(取り消し)ですぐ戻せます。 - GAS: スクリプトが実行されてセルが書き換わると、「元に戻す」ボタンは効きません。
誤ったロジックでGASを実行し、大事なマスタデータを全行「空文字」で上書きしてしまった…なんてことになったら目も当てられません。
🛡️ 対策
- 本番実行前に必ずバックアップ(シートの複製)をとる。
-
Browser.msgBox()で「実行していいですか?」と確認ダイアログを出す。
🕳️ 落とし穴3:即時反映されない(再計算のトリガー問題)
スプシ関数は、参照元のセルが変われば リアルタイム で再計算されます。
しかし、GASは「何かのきっかけ(トリガー)」がないと動きません。
よくある失敗
「A列を入力したのに、B列(GASで計算予定)が変わらない!」とユーザーからクレームが来る。
🛡️ 対策
以下のいずれかの運用を決める必要があります。
-
onEditトリガー: 編集された瞬間に動かす(頻繁に動くと重くなるので注意)。 - ボタン設置: 「計算実行」ボタンを作って押してもらう。
- 時間主導: 1時間に1回まとめて計算する。
「関数のようなリアルタイム性」をGASで完全再現するのは難しい(コストが高い)ことを理解しておきましょう。
🕳️ 落とし穴4:日付(Date)の扱いが別物
スプシとJavaScript(GAS)では、日付の扱いが微妙に違います。
- スプシ: 日付の実体は「シリアル値(数値)」であることが多い。
-
GAS:
new Date()オブジェクトとして扱う。
特にタイムゾーンの問題が厄介です。
getValue() してそのまま setValue() しただけなのに、「日付が1日ズレる」「時間が9時間ズレる」という現象が頻発します。
🛡️ 対策
GASで日付を扱う際は、文字列として整形してから書き込むのが無難です。
Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd');
🕳️ 落とし穴5:再現できない(しにくい)関数がある
スプシ独自の強力な関数は、GAS(標準JavaScript)で再現しようとすると非常にコードが長くなります。
| スプシ関数 | GASでの再現難易度 | 理由 |
|---|---|---|
VLOOKUP |
中 | 配列操作 (find, map) で書けるが、コード量は増える。 |
QUERY |
高 | SQLライクな抽出ロジックをJSで自作するのは大変。 |
GOOGLEFINANCE |
激高 | GASには標準で株価取得APIがない(外部APIが必要)。 |
IMPORTXML |
高 |
UrlFetchApp と正規表現などを駆使する必要がある。 |
これらを無理やりGAS化すると、逆にメンテナンス性が下がります。
「重い計算だけGASにして、データの抽出(QUERYなど)は関数に残す」というハイブリッド構成がおすすめです。
🎁 まとめ
スプシ関数からGASへの移行は、単なる「書き換え」ではありません。
「リアクティブ(自動反応)」な世界から、「プロシージャル(手続き型)」な世界への引っ越しです。
-
配列処理 (
getValues) を徹底する。 - 「元に戻せない」 リスクを想定する。
- トリガー(実行タイミング) を設計する。
- 日付のズレ に注意する。
- 便利な関数 は無理にGAS化しない。
これらを押さえておけば、GAS移行で失敗することはグッと減るはずです。
快適なスプレッドシート生活を!