毎朝、複数のシートから数字をコピーして集計表に貼り、体裁を整えてメールで送る。
30分。手順は頭に入っているので迷いはないけれど、毎日やるとさすがに削りたくなる。
こういうとき、GAS(Google Apps Script)で自動化できます。
ただ、作る前に決めておかないと、後で作り直しになることが3つあります。
先に仕組みを説明してから、順に見ていきます。
■ GASとは何か
Googleスプレッドシートに標準で付いている、JavaScriptの実行環境です。
追加のインストールもサーバーの用意も要りません。
メニューの「拡張機能 > Apps Script」を開くと、コードを書く画面が立ち上がります。
たとえば、シートの中身を読むコードはこうなります。
function readSales() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('売上');
const values = sheet.getDataRange().getValues();
Logger.log(values[0]);
}
getValues() は、シートの中身を二次元配列として返します。
values[0] が1行目、values[0][0] がA1セルです。
書き込みは setValues()、メール送信は MailApp.sendEmail() を使います。
そしてトリガーという機能があります。
画面左の時計アイコンから「毎日午前8時に実行」といった起動条件を設定でき、
無人で回るようになります。
なお1回の実行時間には上限があり(無料アカウントでおおむね6分)、
数万行を一度に処理すると途中で止まります。
■ 決めること1:何を自動化するか
「面倒だから」ではなく「頻度 × 手順の固定度」で選びます。
月1回・5分の作業を自動化しても回収に何年もかかります。
毎日15分なら月に5時間です。ここから手を付けるべきです。
もう1つの軸が手順の固定度です。
・シートAのB列を合計してシートCに書く → 固定。自動化に向く
・数字を見て、おかしそうなものを除く → 判断が入る。自動化に向かない
「おかしそう」を条件に落とし込めないなら、そこは人が見る工程として残してください。
現実的な設計は、下ごしらえだけを自動化して、最後の判断を人に渡す形です。
集計と体裁づくりをGASにやらせ、送信ボタンは人が押す。これだけで大半の時間が消えます。
■ 決めること2:どこまで自動化すると壊れやすくなるか
GASが壊れる原因は、ほぼ「シートの形が変わったこと」です。
・列を1本挿入した → getValues()[3] が別の列を指すようになる
・シート名を「売上」から「売上_2026」に変えた → getSheetByName が null を返す
・誰かが並べ替えた → 行の順番前提の処理が崩れる
考えておくべきなのは、壊れ方をどちらにするかです。
止まって気づく壊れ方と、黙って間違った値を出す壊れ方があります。
後者の方がはるかに危険です。気づくのが数か月後になります。
対策は、処理の冒頭で前提を確認し、違ったら止めることです。
const sheet = ss.getSheetByName('売上');
if (!sheet) throw new Error('シートが見つかりません');
if (values[0][2] !== '金額') throw new Error('C列の見出しが違います');
見出しの位置を固定値で持たず、見出し行を検索して列番号を求める書き方にすれば、
列の挿入には強くなります。ただしすべての変化に耐えるものは作れません。
どこまで守るかを先に決めて、それ以外は止まるようにする。 これが現実的な線です。
■ 決めること3:自動化した後に誰がメンテするか
いちばん軽視され、いちばん後で効いてくる項目です。
作った人が異動した後にシートの仕様が変わり、GASが止まる。
読める人がいないので、また手作業に戻る——よくある結末です。
最低限、次の3つを用意してください。
1. 何をするスクリプトなのかを、コードの先頭に日本語で書く
どのシートを読み、どこに書き、いつ動くのか。3行で足ります。
2. 失敗したときに人に届くようにする
トリガー実行のエラーは、既定では実行ログに残るだけです。
try/catch で囲み、失敗したら MailApp.sendEmail() で通知を送るようにしておくと、
止まったことに当日気づけます。
3. 手作業の手順書を残す
GASが止まった日に、元のやり方へ戻せるようにしておくためです。
■ やってはいけない進め方
最初から全部を自動化しようとすること。
「どうせ作るなら、データ取得から集計、メール送信まで一気通貫で」と設計すると、
どこかで詰まったときに全体が動かず、成果がゼロのまま時間だけが過ぎます。
集計だけ。まずそれだけを動かして、明日から使う。
何日か回すと想定外の例外が出てきます。
それを見てから次を作る方が、結果的に早く仕上がります。
もう1つ。元のシートに直接上書きするスクリプトを、最初に作らないでください。
出力先は新しいシートにして、しばらくは手作業の結果と突き合わせてください。
テスト中のスクリプトが元データを潰すと、復旧に半日かかります。
■ それでも解決しないとき
・実行時間の上限に引っかかって、最後まで動かない
・トリガーを設定したのに、動いていない日がある
・前任者が作ったGASが止まっていて、中身が読めない
このあたりまで来たら、書き足すより一度構造を見た方が早いです。
私はスプレッドシートの自動化と、既存GASの調査・修正を承っています。
コードには日本語のコメントを入れ、どこを変えれば何が変わるかを添えてお渡ししています。
――
この記事の執筆には生成AIを活用しています。内容は実際の挙動を確認して書いています。