毎週の月曜日、あるいは毎月の締め日。同じスプレッドシートを開いて、決まった範囲を合計し、その数字を別のシートやメールに転記する。ひとつひとつは数分の作業でも、毎週くり返せばまとまった時間になり、しかも手で写すぶんだけ写し間違いも起こります。

この「毎回おなじ手順でやっている集計・報告」は、GAS(Google Apps Script)で自動化しやすい部類の作業です。この記事では、スプレッドシートの決めた範囲を毎朝合計して、その結果を自分あてにメールで届ける仕組みを、写経できる最小コードとともに作っていきます。プログラミング未経験でも、拡張機能を開くところから順番に追えるように書きます。

ムチオ
ムチオ
自動化って便利そうだけど、専用のソフトを買ったりサーバーを借りたりするんでしょ?
ルミナ
ルミナ
今回はそれが要らないんです。使うのはGoogleスプレッドシートに最初から付いている仕組みだけ。追加の契約も、あなたのパソコンをつけっぱなしにする必要もありません。まずは何ができるのかから見ていきましょう。

何ができるのか:決めた範囲を集計して、決めた時間に届く

これから作るのは、次のように動く小さな仕組みです。

  • スプレッドシートの決めた範囲(たとえば売上を記録した列)を自動で合計する。
  • その結果を、毎朝の決めた時間に自分あてのメールで届ける。
  • あなたがスプレッドシートを開かなくても、時間になれば勝手に動く。

朝いちばんにシートを開いて電卓で足し算する代わりに、受信トレイに「今日時点の合計はいくら」というメールが届いている状態を作る、というイメージです。集計と報告という定型業務を、人の手からGoogle側の自動処理へ移すわけです。

この土台になるGASは、GmailやスプレッドシートといったGoogleのサービスを自動で操作できる、Googleが無料で提供している仕組みです。ポイントは、書いた処理があなたのパソコンではなくGoogleのサーバー上で動くところにあります。だからパソコンの電源が入っていなくても、決めた時間に処理が走ります。

まず開く:スプレッドシートの拡張機能からApps Scriptへ

身構える前に、実際に画面を開いてしまうのが早いです。集計したいデータが入ったスプレッドシートを用意して、次の手順で進めます。

  1. 自動化したいスプレッドシートを開く。
  2. 上のメニューから「拡張機能」を押す。
  3. 出てきた一覧の中の「Apps Script」を押す。
  4. 新しいタブでコードを書く画面(スクリプトエディタ)が開く。

この画面が、これから処理を書いて置いておく場所です。最初は function myFunction() {} のような空の枠だけが表示されているはずです。ここを、次に用意するコードでまるごと置き換えていきます。

ムチオ
ムチオ
コードを書く画面って言われると、それだけで身構えちゃうな。
ルミナ
ルミナ
最初は下のコードをそのまま貼り付けて動かすだけで大丈夫です。中身を一行ずつ完全に理解していなくても、まず動かして、必要なところだけ自分のシートに合わせて直す。その順番でいきましょう。

写経する:範囲を合計してメールで届ける最小コード

スクリプトエディタに最初から入っている中身をすべて消して、次のコードを貼り付けます。まずは形をそのまま写して、動かすことを優先します。

function sendDailySummary() {
  // ▼ここだけ自分のシートに合わせて直す▼
  const SHEET_NAME = "売上";          // 集計するタブの名前
  const COLUMN = "B";                 // 合計したい列
  const MY_EMAIL = "自分のアドレス@example.com"; // 届け先(自分のメールアドレス)
  // ▲ここまで▲

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName(SHEET_NAME);

  // データが入っている最終行を調べる
  const lastRow = sheet.getLastRow();

  // 数値だけを足し合わせる(文字が混ざったセルは足さない)
  // まだデータが無い(見出し行だけ)ときは lastRow が 1 になる。その場合は合計0のままにする
  let total = 0;
  if (lastRow >= 2) {
    const values = sheet.getRange(COLUMN + "2:" + COLUMN + lastRow).getValues();
    for (let i = 0; i < values.length; i++) {
      const cell = values[i][0];
      if (typeof cell === "number") {
        total += cell;
      }
    }
  }

  // 件名と本文を組み立てる(日付はスプレッドシートのタイムゾーンで表示)
  const tz = ss.getSpreadsheetTimeZone();
  const today = Utilities.formatDate(new Date(), tz, "yyyy/MM/dd");
  const subject = "今日の集計 " + today;
  const body = "現在の合計は " + total + " です。";

  // 自分あてにメールを送る(送信専用の MailApp を使う)
  MailApp.sendEmail(MY_EMAIL, subject, body);
}

まず動かすために直すのは、コードの上に固めておいた3つの値です。

  • SHEET_NAME の「売上」を、集計したいタブの名前に変える。
  • COLUMN の「B」を、合計したい列のアルファベットに変える(C列なら「C」)。
  • MY_EMAIL を、結果を受け取りたい自分のメールアドレスに変える。

貼り付けたら、画面の上にある保存ボタン(ディスクの形のアイコン)を押します。次に、関数を選ぶ欄が sendDailySummary になっていることを確認して、「実行」を押します。初めて実行するときは、スプレッドシートの読み取りと、メールの送信に必要な権限をGoogleが確認してきます。画面の案内に沿って、自分のアカウントで許可を進めてください。これはこのスクリプトに操作の権限を渡す、正規の手順です。ここで大事なのは、今回のコードはメールを送るだけで、Gmailの中身を読む権限までは要求しないという点です。送信専用の仕組み(MailApp)を選んでいるのはそのためで、必要な権限を最小限にとどめています。

うまくいけば、しばらくして自分の受信トレイに「今日の集計」という件名のメールが届きます。

ムチオ
ムチオ
届け先って、ログインしてる自分を自動で拾ってくれたりしないの?
ルミナ
ルミナ
拾える方法もあるんですが、実行のしかたやアカウントの条件によっては拾えないことがあるんです。空っぽのまま送ろうとすると届きません。だから今回は、つまずきを減らすために届け先を直接書いておきます。

GASには、実行中のユーザーの情報からメールアドレスを取得する方法もありますが、実行方法やアカウントの条件によって取得できないことがあります。今回はつまずきを減らすため、送信先はコードに直接書きました。自動実行した人のアドレスを使いたい場合は Session.getEffectiveUser() などの方法もありますが、まずは直接書く形で問題ありません。

つまずきポイント:エラーは前提、直しながら進む

実行ボタンを押すと、一発では通らずに赤い文字のメッセージ(エラー)が出ることがよくあります。ここは先に知っておくと、気持ちがずいぶん楽になります。

ムチオ
ムチオ
うわ、いきなり赤いエラーが出た。やっぱり自分には向いてなかったのかも…。
ルミナ
ルミナ
大丈夫。こういうエラーはよく出ます。失敗ではなく、ほとんど当たり前の途中経過なんですよ。文面には原因の手がかりが書いてあります。まずはよくあるものを一緒に見てみましょう。

初学者が最初にぶつかりやすいのは、だいたい次のあたりです。

  • Cannot read properties of null のようなエラーSHEET_NAME に入れたタブ名が、実際のタブ名と一致していないことが多いです。全角と半角、前後の空白、大文字小文字まで、画面下のタブの名前とぴったり同じか見直します。
  • 合計がいつも0になる:指定した列に数値が入っていない、あるいは列の指定がずれている可能性があります。金額のセルに「円」などの文字が混ざっていると数値として扱われないので、数字だけのセルになっているか確認します。1行目を見出しにしている前提で2行目から集計しているので、データが1行目から始まっている場合は開始行を見直します。
  • メールが届かないMY_EMAIL のアドレスに打ち間違いがないか、迷惑メールに振り分けられていないかを確認します。

エラーの文面は、そのまま原因を探す手がかりになります。メッセージを一字一句コピーして検索したり、AIに貼り付けて「どう直せばいいか」を尋ねたりすると、修正の方向が見えてきます。この「試す・エラーを見る・直す」の往復は、自動化を作るときのごく普通の進め方です。一度で完成しなくても、焦る必要はありません。

AIに聞くときは、エラーを丸ごと貼って「直して」と頼むより、何をどの順で答えてほしいかを添えると、初心者にも分かる形で返ってきます。たとえば次のように書きます。

このエラーが出ました。

Cannot read properties of null (reading "getLastRow")

初心者にも分かるように、
1. 何が原因か
2. どこを確認すればいいか
3. 直したあとのコード
の順で教えてください。

エラー本文の部分を、実際に画面に出たメッセージへ置き換えて使ってください。手を動かしながら、隣にAIを置いて一緒に直していく。これが、いまの自動化のいちばん現実的な進め方です。

気づきにくい落とし穴:範囲を決め打ちすると取りこぼす

ここでひとつ、初学者がなかなか気づけない落とし穴に触れておきます。

範囲を B2:B100 のように行数を固定して書くと、101行目以降にデータが増えても、そこは黙って集計から外れます。エラーは出ません。合計だけが実際より少なくなるので、「なぜか数字が合わない」ことに、しばらく気づけないのです。

ムチオ
ムチオ
エラーが出ないなら、間違ってても気づきようがないじゃん…。
ルミナ
ルミナ
そうなんです。だから上のコードでは getLastRow() という、データが入っている最終行を教えてくれる仕組みを使って、行が増えても最後まで拾えるようにしてあります。行数を決め打ちしないだけで、この取りこぼしはかなり防げますよ。

もし固定の範囲で書きたい場面があるとしても、「その行数を超えたぶんは合計されない」ことは頭の片隅に置いておいてください。データは時間とともに増えていくものなので、範囲は最終行まで動的に取るのが基本です。

自動で動かす:時間主導トリガーを設定する

ここまでは、実行ボタンを自分で押して動かしていました。これを「毎朝決めた時間に勝手に動く」状態にするのが、最後の一歩です。GASには、決めた時間に処理を自動で動かす仕組みがあり、これをトリガーと呼びます。目覚まし時計をセットしておくようなものです。

スクリプトエディタの左側にある、時計の形のアイコン(トリガー)から設定します。

  1. 左メニューの時計アイコン(トリガー)を押す。
  2. 右下の「トリガーを追加」を押す。
  3. 実行する関数として sendDailySummary を選ぶ。
  4. イベントのソースを「時間主導型」にする。
  5. 「日付ベースのタイマー」を選び、時間帯を「午前7時〜8時」のように指定する。
  6. 保存する。

これで、あなたが何もしなくても、指定した時間帯に毎日メールが届くようになります。パソコンを開いていなくても、Google側で処理が走るので問題ありません。

ひとつ知っておきたいのは、この時間帯の指定は「7時ちょうどに動く」という約束ではないことです。「午前7時〜8時」を選ぶと、その1時間のどこかでGoogleが実行してくれる、という指定になります。多少の前後があるので、分単位で正確な時刻に届かせたい用途には向きません。集計や通知のように「その時間帯に届いていればよい」ものであれば、これで十分です。

ムチオ
ムチオ
毎日じゃなくて、毎週月曜だけにしたいときは?
ルミナ
ルミナ
トリガーの種類を「週ベースのタイマー」に変えて、曜日を選べば大丈夫です。毎週の集計なら、そのほうが自然ですね。まずは毎日で動かしてみて、慣れてきたら頻度を自分の業務に合わせて変えていくとよいですよ。

一点だけ気をつけたいのは、実行の間隔です。数分おきのように頻繁に動かす設定にすると、必要以上に処理が走ります。集計や通知は、1日1回や週1回など、実際に見たい頻度にとどめておくのが安心です。

動かし続けるために:知っておくと安心なこと

最小の仕組みは、ここまでで動きます。そのうえで、実際に毎日回していくと出てくる「気になるところ」を、入門の範囲で先に触れておきます。全部を最初から作り込む必要はありません。困ったときに「そういえば、あの話があったな」と思い出せれば十分です。

上限(割り当て)がある。GASは無料で使える代わりに、1日に送れるメールの数や、トリガーで動かせる合計時間に上限があります。個人のGoogleアカウントでは、メールの送信は1日あたりの宛先数でおおよそ100件、トリガーの合計実行時間は1日あたり90分ほどが目安です(Google Workspaceのアカウントはこれより多め)。1日1通の集計メールなら、まず気にする必要はありません。ただし「1000人に一斉送信」のような使い方に広げると、この上限に当たって処理が止まることがある、とだけ覚えておいてください。

※上限は2026年8月時点のものです。Google側の仕様変更によって変わる場合があります。

動いたかどうかは、履歴で確認できる。スクリプトエディタの左メニューにある「実行数」から、いつ実行され、成功したか失敗したかの履歴を見られます。トリガーが失敗したときは、そのスクリプトの持ち主宛てに、Googleから失敗の通知メールが届く設定になっています。「気づいたら止まっていた」を防ぐ最初の砦です。

持ち主が誰かを意識しておく。トリガーは、それを設定した人のアカウントに紐づいて動きます。仕事で使うものなら、作成者が異動・退職するときに、そのアカウントが無効になる可能性も含めて、誰の持ち物になっているかを把握し、引き継ぎのときに一緒に見直せるようにしておくと安心です。

あとから権限が増えると、再認証が要ることがある。最初は集計とメールだけだった処理に、あとでカレンダーを読む機能などを足すと、新しい操作の許可が必要になります。このとき困りやすいのが、トリガーの自動実行中は許可の画面を出せないという点です。追加の権限が必要になったら、一度自分で手動実行して許可の画面を通しておく。そうしないと、トリガー側は権限が足りずに失敗し続けます。機能を足したら手で一度動かす、と覚えておくとつまずきません。

ムチオ
ムチオ
最初からこれ全部やらなきゃダメなの?けっこう多いな…。
ルミナ
ルミナ
いえ、まずは最小の仕組みを動かすことが先です。ここに書いたのは、使い続けるうちに「あれ?」となったときの答え合わせ用。監視や再送の作り込みは、必要になってからで大丈夫ですよ。

次の一歩

ここまでで、決めた範囲を集計して決めた時間にメールで届ける、という定型業務の自動化がひとつ形になりました。まずはこの最小の仕組みを自分のシートで動かしてみて、範囲や頻度を業務に合わせて調整してみてください。

そのうえで、次の方向に広げていけます。

  • 集計結果をAIに整理させる:単純な合計だけでなく、数字の傾向や気づきを言葉で添えたいときは、GASからGeminiを呼び出す作り方があります。GeminiとGASでAI秘書を作るで、メールと予定を読ませて優先順位を通知する応用例を扱っています。
  • 貯まっていくデータの共有範囲を点検する:集計元のスプレッドシートには、放っておくとデータが貯まり続けます。誰が見られる状態になっているかは、作った本人ほど見落としやすいところです。スプレッドシート共有と権限の落とし穴で、3分でできる点検リストとあわせて整理しています。

まとめ

  • 毎回おなじ手順でやっている集計・報告は、GAS(Google Apps Script)で自動化しやすい定型業務。
  • スプレッドシートの「拡張機能」から「Apps Script」を開くところが入口。追加の契約もサーバーも要らない。
  • まず動かすのはシート名・列・届け先の3か所。届け先は自分で書いておくと、トリガー実行でも確実に届く。
  • 範囲を決め打ちすると、増えた行を黙って取りこぼす。最終行まで動的に取るのが基本。
  • エラーは失敗ではなく途中経過。文面を手がかりに、試す・直すをくり返して進める。
  • 時間主導トリガーで自動化できる。時刻は多少ずれる。上限・実行履歴・持ち主・再認証は、必要になってから押さえれば十分。

独学でつまずきやすいのは、こうした一つひとつの技術そのものよりも「自分の仕事のどこを、何から自動化すればいいか」という順番の見きわめです。GASやスプレッドシートを自分の業務にどう組み込むかも、あなたの目標から逆算した学ぶ順番の一部として、1対1で一緒に整理できます。