GASで日報を自動集計する仕組みの作り方

GASで日報を自動集計する仕組みの作り方

この記事の要点

  • 集計のしやすさは「入力を1行1レコードに揃える設計」でほぼ決まる
  • フォーム蓄積・日次集計・自動送信をGASの3スクリプトで実装。コード掲載
  • 実行停止やデータ破損を防ぐ設定を4つの失敗例で解説

毎日集まる日報を、担当者が手作業で表に転記して集計していませんか。この記事は、日報を毎日出しているのに集計だけが手作業で残っている、月末に転記でまとまった時間を取られている、という中小企業の管理者・情シス担当の方に向けた記事です。

Googleスプレッドシートとレゴブロックのように組み合わせられるGAS(Google Apps Script)を使えば、この転記と集計を丸ごと自動化できます。GASとは、Googleのサービスを自動で動かすための無料の仕組みのことです。

GASは、Googleアカウントがあれば誰でも無料で利用できる、Google Workspaceの統合、自動化、拡張のためのローコードプラットフォームです。読み終わる頃には、コピペで動くコードをもとに「入力が集まる→毎朝集計される→関係者にメールが届く」という流れを自分で組める状態を目指します。

日報のテンプレート設計そのものはAI日報を自動化するプロンプトと運用術で扱っているので、入力項目づくりから始めたい方は先にそちらを見てください。

GASで日報を自動集計する仕組みの作り方
Contents / 目次
  1. 結論。日報の自動集計は3つの部品でできている
  2. 作り方の手順。フォームから自動送信までを5ステップで
  3. どう変わるか。手作業の集計がゼロになる
  4. よくある失敗と回避法。動かなくなる原因は決まっている
  5. 導入前に知っておきたい妥協点。GASが向く仕事と向かない仕事
  6. よくある質問

結論。日報の自動集計は3つの部品でできている

日報の自動集計は、突き詰めると3つの部品の組み合わせです。難しいプログラムを一から書く必要はなく、この3つを順番につなぐだけで動きます。

  • 集める部品:Googleフォームで入力を受け取り、スプレッドシートに1行ずつ自動でためる
  • 計算する部品:ためたデータをGASが毎日決まった時刻に読み込み、担当者別・日別に合計する
  • 届ける部品:集計結果をメールやチャットに自動で送り、誰も開かなくても数字が回る状態にする

この3部品のうち、成否を大きく左右するのは実は1つ目の「集める部品」です。もう少し詳しく言うと、データが「1行に1件、1セルに1情報」というきれいな形でたまっていれば、計算も送信もあっけないほど簡単になります。逆にここが崩れると、どんなにコードを頑張っても集計はうまくいきません。

ポイント。コードを書く前に「集計できる形」でデータをためる設計をする。ここを飛ばすと、あとから何倍もの手間がかかります。

まず、日報を「どこに書いてもらうか」で3つの選択肢があります。自社に合うものを最初に決めておきましょう。

入力方法向いている場面集計しやすさ注意点
Googleフォーム項目が決まっている日報。現場・営業とても高い(自動で1行1件になる)自由記述が多いと集計に使えない
スプレッドシート直接入力PC作業が中心。少人数中(入力ルールを守らせる必要)セル結合や書式崩れが起きやすい
チャット(LINE・Slack等)すでにチャットで報告する習慣がある低〜中(連携の作り込みが要る)初期構築の難易度が上がる

非エンジニアの方が最初に作るなら、迷わずGoogleフォームをおすすめします。入力が自動で1行ずつスプレッドシートにたまり、データがきれいな形に整うからです。

この記事も、フォームを使う前提で手順を進めていきます。

作り方の手順。フォームから自動送信までを5ステップで

ここからが記事の本体です。フォーム入力を受け取り、毎朝集計し、メールで送るところまでを5つのステップに分けて、コピペで動くコード付きで解説します。

GASで日報を自動集計する仕組みの作り方

ステップ1。集計できる日報の項目を設計する

最初にやるのは、日報の入力項目を「あとで集計できる形」に決めることです。集計したい数字(訪問件数、作業時間など)は、必ず自由記述ではなく数値専用の項目に分けます。

Googleフォームで、次のような項目を作ります。日付は自動で記録されるので、フォームには入れなくて構いません。

  • 氏名:プルダウンで選ばせる(手入力させると表記揺れが起きる)
  • 部署:プルダウンで選ばせる
  • 訪問件数:数値のみ(記述式で「数値」の入力チェックをかける)
  • 作業時間(時間):数値のみ
  • 今日の業務内容:自由記述(集計対象にはしない、共有用)
  • 課題・気づき:自由記述

氏名を毎回手入力させると「山田」「山田太郎」「ヤマダ」が別人として集計されます。集計に使う項目は、必ずプルダウンなど選択式にして表記を固定してください。

フォームを作ったら、回答をスプレッドシートに出力する設定にします。これでフォーム送信のたびに、1行1件でデータが自動でたまっていきます。この「1行1件」の形が、あとの集計をラクにする土台です。

ステップ2。スクリプトエディタを開いて置き場所を用意する

次に、集計を動かすGASの置き場所を用意します。回答がたまるスプレッドシートを開き、メニューの「拡張機能」から「Apps Script」を選択してエディタを開きます。画面の表記や位置は変わることがあるため、最新の操作はGoogle Apps Script公式ドキュメントで確認してください。

エディタが開くと、白紙のコードを書く画面が出ます。ここに、これから紹介するコードを貼り付けていきます。プログラムを書いた経験がなくても、コピペして必要な箇所だけ書き換えれば動きます。

ステップ3。日次集計のコードを貼り付ける

担当者別に「訪問件数」「作業時間」を合計するコードです。回答シートの名前と集計シートの名前を、自社のものに書き換えて使ってください。動く形の完結したコードなので、そのまま貼り付けられます。

// ▼ 前提:フォーム回答がたまるシートと、集計結果を書き出すシートを
//   同じスプレッドシート内に用意しておく(集計シートは空でOK)
// ▼ 列の順番は「タイムスタンプ / 氏名 / 部署 / 訪問件数 / 作業時間 / ...」を想定

function aggregateDailyReports() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const srcSheet = ss.getSheetByName('フォームの回答 1'); // [自社の回答シート名に変更]
  const outSheet = ss.getSheetByName('集計');            // [自社の集計シート名に変更]

  const data = srcSheet.getDataRange().getValues();
  data.shift(); // 1行目の見出しを除外

  // 毎朝動かすので、前日0時〜今日0時の分(前日の日報)を対象にする
  const today = new Date();
  today.setHours(0, 0, 0, 0);
  const yesterday = new Date(today);
  yesterday.setDate(yesterday.getDate() - 1);

  const totals = {}; // 氏名ごとの合計を入れる箱

  for (const row of data) {
    const timestamp = new Date(row[0]);
    if (timestamp < yesterday || timestamp >= today) continue; // 前日以外の行は集計しない

    const name = row[1];          // 氏名
    const visits = Number(row[3]) || 0; // 訪問件数(数値でなければ0扱い)
    const hours  = Number(row[4]) || 0; // 作業時間

    if (!totals[name]) {
      totals[name] = { visits: 0, hours: 0, count: 0 };
    }
    totals[name].visits += visits;
    totals[name].hours  += hours;
    totals[name].count  += 1; // 日報の提出件数
  }

  // 集計シートを一度きれいにして、見出しを書く
  outSheet.clear();
  outSheet.appendRow(['集計日', '氏名', '提出件数', '訪問件数合計', '作業時間合計']);

  const dateStr = Utilities.formatDate(yesterday, 'Asia/Tokyo', 'yyyy/MM/dd');
  for (const name in totals) {
    const t = totals[name];
    outSheet.appendRow([dateStr, name, t.count, t.visits, t.hours]);
  }
}

コードの中の日本語コメント(先頭に // が付いた行)は、何をしている部分かの説明です。書き換えるのは「回答シート名」と「集計シート名」の2か所だけで、あとはそのまま動きます。まずはエディタ上でこの関数を手動実行し、集計シートに数字が並ぶかを確認してください。初めて実行するときは、スプレッドシートを操作する許可を求める画面が出るので、承認します。次のステップでメールを送るコードを足したときも、新しい許可を求める画面が出るので、同じように承認します。

ステップ4。集計結果を自動でメール送信する

集計ができたら、その結果をメールで関係者に送るコードを足します。毎朝メールボックスに数字が届けば、誰もスプレッドシートを開かなくても状況が共有されます。

function sendReportMail() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const outSheet = ss.getSheetByName('集計');
  const rows = outSheet.getDataRange().getValues();

  // メール本文を組み立てる
  // rows の各行は[集計日 / 氏名 / 提出件数 / 訪問件数合計 / 作業時間合計]の順
  let body = '前日の日報集計です。\n\n';
  for (let i = 1; i < rows.length; i++) { // 1行目の見出しは飛ばす
    const r = rows[i];
    body += r[1] + ':提出' + r[2] + '件 / 訪問' + r[3] + '件 / 作業' + r[4] + '時間\n';
  }

  MailApp.sendEmail({
    to: 'manager@example.com',   // [送信先を自社のアドレスに変更]
    subject: '【日報集計】' + (rows[1] ? rows[1][0] : ''), // 件名に集計日を入れる
    body: body
  });
}

送信先アドレスだけ書き換えれば動きます。集計とメールを続けて動かしたいときは、集計する関数の最後に sendReportMail(); と1行足せば、集計のあとに自動でメールまで飛びます。チャットに流したい場合も、送信部分を各サービスのメッセージ送信に差し替える考え方は同じです。

ステップ5。毎朝決まった時刻に自動実行させる

最後に、このコードを毎朝自動で動かす設定をします。GASには「トリガー」という、決めた時刻やタイミングで自動実行する仕組みがあります。時間指定のトリガーを設定し、たとえば毎朝7時から8時の間に集計する関数を動かすよう指定します。

トリガーの設定は、スクリプトエディタの左側メニューにある「トリガー」(時計アイコン)から行えます。画面の表記や位置は変わることがあるため、最新の設定手順はGoogle Apps Script公式ドキュメントで確認してください。設定できれば、あとは人が何もしなくても、毎朝集計され、メールが届く状態が完成します。ここまでで「集める・計算する・届ける」の3部品がひとつながりになりました。

どう変わるか。手作業の集計がゼロになる

この仕組みを入れると、毎日の転記と月末のまとめ作業が、人の手からほぼ消えます。担当者はフォームに入力するだけ、管理者はメールを見るだけになります。

GASで日報を自動集計する仕組みの作り方

とくに効果が大きいのは、日報を出す人数が多い現場です。仮に15人が毎日日報を出していて、その転記と集計に管理者が1日15分かけているとします。月20営業日なら、それだけで月5時間が集計作業に消えている計算です。

この5時間が、仕組みを組んだあとはほぼゼロになります。数字はあくまで一例で、人数や項目数によって変わりますが、「毎日発生する転記」を消せる効果は共通です。

最初から完璧を狙わず、小さく始めるのがおすすめです。まず「訪問件数の合計」など1〜2項目だけ自動集計し、動くことを全員で確認してから項目を増やします。いきなり全項目を自動化しようとすると、設計もコードも複雑になり、途中で挫折しやすくなります。

成果を出すコツ。最初は集計項目を1つに絞る。動く実感を全員が持てると、その後の項目追加はスムーズに進みます。

さらに一歩進めたい場合は、集計後のデータをAIに読ませて「気になる点」を抽出させる使い方もあります。たとえば課題欄の自由記述をまとめて要約させれば、管理者が全文を読まなくても傾向をつかめます。GAS以外のツールで毎朝の集計を自動化したい方はReplit Agentで毎朝のデータ集計を自動化する手順も参考になります。

よくある失敗と回避法。動かなくなる原因は決まっている

GASでの日報集計がうまくいかなくなる原因は、実はいくつかのパターンに集中しています。起こりやすい4つの失敗を、起きる状況と防ぎ方のセットで紹介します。

GASで日報を自動集計する仕組みの作り方

失敗1。氏名や数値の表記がバラバラで合計できない

氏名を手入力にしていて「田中」「田中一郎」が別集計になる、訪問件数の欄に「3件」と文字を入れてしまい数値として足せない、というケースです。集計が合わないと、仕組み全体が信用されなくなります。

防ぎ方は入力の入り口を固めることです。氏名・部署は必ずプルダウンで選ばせ、件数や時間は数値だけしか入らないよう入力チェックをかけます。コード側で頑張って表記を直そうとするより、入り口をそろえる方がはるかに確実です。

失敗2。データが多すぎて途中で実行が止まる

GASには、1回の実行は6分まで、トリガーで動かす処理の1日の合計は無料のGoogleアカウントで90分・Google Workspaceのアカウントで6時間まで、という上限があり、超えると処理が途中で止まります。上限の値は変わることがあるため、使う前にGoogle公式の割り当ての一覧で確かめてください。日報が何千行もたまった状態で全行を毎回読み込むと、この上限に引っかかりやすくなります。

回避策は、毎回すべてを処理しないことです。掲載したコードは全行を読み込んでから前日の分を選んでいるため、行数が増えると処理時間も延びます。古いデータは別シートに移すか、月ごとにシートを分けるのも有効です。

失敗3。集計の処理が重なってデータが壊れる

朝の同じ時間帯に複数の処理が重なると、集計シートへの書き込みがぶつかり、数字が二重になったり欠けたりすることがあります。とくに人数が多い会社で起きやすい失敗です。

これは「LockService」という、処理が重ならないよう順番待ちさせる仕組みで防げます。集計関数の先頭に次の数行を足すだけで、二重実行を防げます。

function aggregateDailyReports() {
  const lock = LockService.getScriptLock();
  if (!lock.tryLock(10000)) { // 10秒待って取れなければ中止
    return; // ほかの処理が動いている間は実行しない
  }
  try {
    // ここに集計の処理本体を書く(前のコードの中身)
  } finally {
    lock.releaseLock(); // 処理が終わったら必ずロックを外す
  }
}

失敗4。エラーに誰も気づかず集計が止まっていた

自動化の怖いところは、止まっても誰も気づかない点です。トリガーが失敗すると、Apps Scriptはトリガーを設定した本人に失敗の通知メールを送ります。ただし、設定した担当者が見落としたり異動したりすると、「先月から集計が止まっていた」と月末に発覚することがあります。

防ぐには、エラーが起きたら自分に通知が飛ぶようにしておきます。処理をtry文で囲み、失敗したらエラー内容を自分宛にメールする一行を足すだけです。GAS側の失敗通知は、トリガーの設定画面で通知の頻度を変えられるので、すぐに通知される設定にしておくと安心です。打刻漏れのような「起きなかったこと」を検知する考え方は打刻漏れをAIで検知しTeamsに自動通知する作り方でも解説しています。

導入前に知っておきたい妥協点。GASが向く仕事と向かない仕事

正直にお伝えすると、GASでの自動化は万能ではありません。向いている仕事と、無理に使わない方がいい仕事があります。ここを理解しておくと、遠回りせずに済みます。

GASが得意なのは、項目が決まっていて、集計ルールがはっきりしている日報です。訪問件数を足す、作業時間を部署別に出す、といった「決まった計算を毎日繰り返す」仕事は、まさに得意分野です。

逆に苦手なのは、集計ルールが毎月のように変わる業務や、複雑な条件分岐が絡む処理です。こうしたものをGASで作り込むと、コードがどんどん膨れ上がり、作った人しか直せない「ブラックボックス」になりがちです。

作った担当者が退職すると、誰も直せず運用が止まることがあります。属人化はGAS自動化の大きなリスクです。

この属人化を防ぐには、次の3点を最初から守るのがおすすめです。

  • コメントを残す:コードの各処理に、何をしているか日本語のコメントを付ける
  • 作りを説明した文書を1枚残す:どのシートをどう集計しているか、A4一枚で図解しておく
  • 複雑にしすぎない:1つのコードに機能を詰め込まず、集計と送信は分けておく

また、規模が大きくなってきたら、GASにこだわらずノーコードの連携ツールや業務アプリ作成ツールに切り替える判断も必要です。自社でどこまで内製し、どこからプロに任せるかの線引きは、担当者の時間と社内に残せる知識の量で決めるのが現実的です。エクセル集計をAIに任せる選択肢を比べたい方はCopilot in Excelで表を自動集計する手順も見比べてみてください。

よくある質問

プログラミングの知識がなくても本当に作れますか

はい、この記事のコードをコピペし、シート名や送信先など数か所を書き換えるだけで動きます。最初から自分でコードを書く必要はありません。ただし「なぜ動くか」を少し理解しておくと、あとで直せるようになり、属人化も防げます。

費用はかかりますか

GAS自体はGoogleアカウントがあれば無料で使えます。追加のツール契約なしで始められるのが大きな利点です。ただし、1日に送れるメールの宛先の数(無料のGoogleアカウントで100、Google Workspaceのアカウントで1,500)や、トリガーで動かす処理の1日の合計時間には上限があります。上限の値は変わることがあるため、大量に送信する場合はGoogle公式の割り当ての一覧で確かめてください。

日報にAIで要約や気づきの抽出もさせられますか

できます。集計後の自由記述をAIに渡せば、要約や課題の抽出を任せられます。まずは数値の集計から仕組みを作り、動きが安定してからAI連携を足すと、無理なく段階的に高度化できます。

Googleフォームを使わずスプレッドシート直接入力でもできますか

可能ですが、集計のしやすさはフォームに劣ります。直接入力はセル結合や書式崩れ、入力位置のズレが起きやすく、集計が合わなくなる原因になります。入力を標準化しやすいフォームから始めるのが失敗しにくい進め方です。

まずは今日、自社の日報でどの項目を数字として集計したいかを1つだけ紙に書き出してみてください。それが決まれば、この記事のコードにそのまま当てはめて動かせます。日報だけでなく社内の問い合わせや報告を見える化したい方は、社内問い合わせを集計フォームで見える化する自作6ステップもあわせてどうぞ。

ここまで読んで、仕組みは分かったけれど自社の業務に落とし込むのは不安、途中で属人化しそうで怖い、と感じた方もいると思います。コレットラボのAI導入支援・DX支援では、仕組みにしたい業務が1つ決まっている場合、業務専用の入力画面と社員向け手順書まで作ります(1業務実装パック)。AI導入支援・DX支援について、気軽にお話を聞かせてください。

仕事で使えるAI活用情報をLINEで

AIの活用ポイントと、DX・AXコラムをお届けします。登録後のアンケートでは、活用例や指示文、業務に使える資料、社内導入の情報など、受け取りたいテーマを選べます。

通常は金曜日12:10、週0〜1回程度の配信です。コラムのお知らせは、アンケート未回答でも受け取れます。

LINEでAI活用情報を受け取る(新しいタブで開きます)

個別のご相談

サービスの選び方やご依頼について、ご相談いただけます。

相談する

Read Next / 次に読む

名刺をAIでデータ化する手順|顧客リスト自動化のやり方
DX・AX

名刺をAIでデータ化する手順|顧客リスト自動化のやり方

2026.07.24 / 約 13 分

関連記事

DX・AX

AI壁打ちのやり方|1人広報が思考を整理し消耗しない5ステップ

更新
DX・AX

AI秘書の作り方|メール返信と予定調整をAIに任せる3ステップ

更新
DX・AX

問い合わせ履歴をAIに読ませFAQの抜けを自動で洗い出す手順

更新
DX・AX

領収書入力をAIで自動化|撮影からfreee取込までの手順と型

更新
DX・AX

打刻漏れをAIで検知しTeamsに自動通知する作り方|非エンジニア向け

更新
DX・AX

AI業務効率化を社員に教える順番|社内研修の進め方と判断ポイント

更新
DX・AX

AIに入力してはいけない個人情報|線引きと社内ルールの作り方

更新
DX・AX

プレスリリース効果測定をAIで自動化|収集から分析まで手順解説

更新
DX・AX

Zapierで問い合わせを営業に自動配信する手順|AI仕分け付き

更新
DX・AX

長崎のAI研修・生成AI研修|公的窓口と出張研修の使い分け

DX・AX

AI議事録の情報漏洩リスク|音声を渡す前に見る5項目

更新
DX・AX

AI感を消す文章の書き方|スタイルガイドと編集チェックリスト

更新