0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【GAS】「スプシが重いからGASにする」は要注意!関数を移行する際の「落とし穴」5選 🕳️

Posted at

【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で計算予定)が変わらない!」とユーザーからクレームが来る。

🛡️ 対策

以下のいずれかの運用を決める必要があります。

  1. onEdit トリガー: 編集された瞬間に動かす(頻繁に動くと重くなるので注意)。
  2. ボタン設置: 「計算実行」ボタンを作って押してもらう。
  3. 時間主導: 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への移行は、単なる「書き換え」ではありません。
「リアクティブ(自動反応)」な世界から、「プロシージャル(手続き型)」な世界への引っ越しです。

  1. 配列処理 (getValues) を徹底する。
  2. 「元に戻せない」 リスクを想定する。
  3. トリガー(実行タイミング) を設計する。
  4. 日付のズレ に注意する。
  5. 便利な関数 は無理にGAS化しない。

これらを押さえておけば、GAS移行で失敗することはグッと減るはずです。
快適なスプレッドシート生活を!


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?