この記事のポイント
- スプレッドシートとGASで月次レポートを自動作成するには、ファイルを「集計(元データ・集計・説明のシート)」と「報告書のひな形」に分けます。集計はQUERY関数とSUMIFS、GASは報告書の複製・PDF・下書きメールを受け持ちます
- 所見は人が書くので、GASの処理は2回に分けます。月初に時間主導型トリガーで報告書を作って数字を入れ、所見を書いた後に手で実行してPDFの保存と下書きメールを作ります。メールは送信まではしません
- コードにシート名やセルの番地を書かず、名前付き範囲とファイルのIDで指します。集計に確認のセルを置き、元データが足りない・合計が合わないときはGASを止めます
- 時間主導型トリガーは作った人のアカウントで動き、失敗は画面に出ずメールで届きます。1回の実行は6分まで、トリガーの合計は1日90分まで(Google Workspaceは6時間)です(2026年11月3日に公式ページで確認)
- 壊れやすいのは、元データの途中への列の挿入(QUERYの列の記号は書き換わらず、別の列を合計してもエラーにならない)、タイムゾーンの違い、作った人の退職です
スプレッドシートとGASで月次レポートを自動作成するとは、Google スプレッドシートにためた元データを関数で集計し、GAS(Google Apps Script)で毎月の報告書のファイル作り、PDF への変換、メールの下書きまでを決まった手順で動かすことです。数字を確かめる、所見を書く、メールを送る、の3つは人に残します。
先に結論を書きます。
- ファイルを「集計」(元データ・集計・説明のシート)と「報告書のひな形」に分ける。集計は QUERY 関数と SUMIFS に任せ、GAS は数字を運ぶだけにする
- GAS の処理は2回に分ける。月初に時間主導型トリガーで報告書を作って数字を入れ、所見を書いた後に手で実行して PDF の保存と下書きメールを作る。送信は人がする
- コードにシート名やセルの番地を書かず、名前付き範囲とファイルの ID で指す。集計に確認のセルを置き、合わないときは GAS を止める
- トリガーは作った人のアカウントで動き、失敗はメールで届く。担当が替わるときはトリガーを作り直す
方法の全体の比べ方は「月次報告書を自動作成する6つの方法を比較」、Excel で作る場合は「Excelで月次報告書を自動作成する手順」にあります。数字を毎日見るダッシュボードが目的なら、Looker Studio のほうが向きます(Looker Studio の構築代行を頼む前に読む記事)。
この記事は、月次レポートの作成代行と自動化(おまかせレポート)を提供している inovie株式会社 が書いています。GAS のコードは、Google の公式リファレンス(developers.google.com/apps-script、2026年11月3日に確認)に載っているクラスとメソッドだけで書き、名前と引数を1つずつ確かめましたが、実行はしていません。動作は Google の公式リファレンスで確かめた範囲です。使う前に、テスト用のファイルとフォルダで試してください。 作業時間は測っていないため、どれだけ減るかは書いていません。
スプレッドシートとGASで、月次レポートのどこまで自動にできる?
集計から PDF とメールの下書きまでは自動にできます。人に残るのは、元データの取り込み(CSV で受け取る場合)、数字の確認と所見、送信の3つです。
| 工程 | 使うもの | 自動か人か |
|---|---|---|
| 1 元データを入れる | [ファイル]→[インポート]で CSV を行として足す | 人(月に1回) |
| 2 集計する | QUERY 関数・SUMIFS(式) | 自動(式が計算し直す) |
| 3 報告書を作り、数字を入れる | GAS(時間主導型トリガー) | 自動(例:毎月3日の9時台) |
| 4 数字を確かめ、見出しと所見を書く | 月ごとの報告書のファイル | 人 |
| 5 PDF を保存し、メールの下書きを作る | GAS(担当者が手で実行) | 人が実行し、中身は自動 |
| 6 送る | Gmail の下書き | 人 |
例にするのは、カスタマーサポートを受託する BPO の会社が委託元へ毎月出す月次業務報告書のサンプルです(全6ページ、社名と数字はすべて架空です)。元データは、コールセンターのシステム(CTI)から書き出す日別の CSV です。

GAS の処理を2回に分けているのは、所見を人が書くからです。数字が入った時点で PDF とメールまで進めると、所見のない報告書ができてしまいます。
作る前に何を決める?ファイルとシートの分け方
集計のファイルと、報告書のひな形を分ける
| 置き場所 | 中身 | 人が触るか |
|---|---|---|
| 集計のファイル:元データのシート | CSV から取り込んだ日別の行(1日1行) | 月に1回、取り込むだけ |
| 集計のファイル:集計のシート | 対象月のセル、QUERY・SUMIFS の表、確認のセル | 触らない(対象月は GAS が変える) |
| 集計のファイル:説明のシート | 毎月の手順、ID と名前の一覧、止まったときの直し方 | 担当が替わったとき |
| 報告書のひな形(別のファイル) | 報告書のページのシートだけ。数字の欄、グラフ、所見の欄 | 型を変えるときだけ |
| 月ごとの報告書(保存先のフォルダ) | ひな形の複製に、その月の数字が入ったもの。PDF も同じフォルダに置く | 見出しと所見だけ |
報告書を別のファイルにするのは、PDF にするときにファイルごと変換するからです。集計のシートが同じファイルにあると、それも PDF に入ります。グラフの元になる表は報告書のファイルの中に置き、PDF に出したくない表の置き場所は、テスト用のファイルで PDF を出して決めます。
シートとセルは「名前付き範囲」で指す
集計のシートとひな形の両方に、範囲を選んで[データ]→[名前付き範囲]で同じ名前を付けます。名前に使えるのは文字・数字・アンダースコアで、先頭に数字、空白、句読点は使えません(Google「セル範囲に名前を付ける」)。この記事では英字の名前にしています。
コードにシート名やセルの番地(C2 など)を書くと、枠を動かすたびにコードを直すことになります。名前で指しておけば、[名前付き範囲]の画面で範囲を選び直すだけで済み、JavaScript を読めない人でも直せます。

名前付き範囲を削除すると、その範囲を参照する数式は動かなくなります(同じヘルプ)。名前の一覧は説明のシートに書いておきます。
手順1:集計のシートはQUERY関数とSUMIFSでどう作る?
元データは1日1行で、下に足していく
元データのシートは、CTI から書き出す日別の CSV と同じ列にします。
| 列 | A | B | C | D | E | F |
|---|---|---|---|---|---|---|
| 中身 | 日付 | 入電数 | 応答数 | 対応件数 | 処理時間の合計(秒) | 処理ミス |
CSV は、元データのシートを開いて[ファイル]→[インポート]を選び、読み込みのオプションで「現在のシートに行を追加する」を選ぶと、いちばん下の行の下に足されます(Google「データセットとスプレッドシートを読み込む」)。CSV に見出しの行があると、それも1行として足されるので、取り込んだら消します。
月ごとにシートを分けると集計の式も毎月増えるので、1枚のシートに下へ足していきます。
日別の表は QUERY 関数で作る
集計のシートに対象月のセルを1つ置き、target_month と名前を付けます(例:2026/10/1)。日別の対応件数は次の式で出します。
=QUERY(元データ!A:F, "select A, sum(D) where A >= date '"&TEXT(target_month,"yyyy-mm-dd")&"' and A < date '"&TEXT(EDATE(target_month,1),"yyyy-mm-dd")&"' group by A order by A", 1)
「対象月の1日以上、翌月の1日より前の行を選び、日付ごとに対応件数(D 列)を合計して並べる」という意味です。クエリの中では、列を A・B のような列の記号で、日付を date '2026-10-01' の形で書きます(Google「QUERY 関数」、クエリ言語のリファレンス)。対象月のセルは、TEXT 関数で 2026-10-01 の形の文字にしてからクエリに組み込んでいます。TEXT の mm は、時・秒と一緒に使わなければ月を表します(TEXT)。
結果は見出しの1行と、日付ごとの行です。名前付き範囲 daily は、見出しを除いた31行に付けます。30日までの月は、最後の行が空になります。

この31行が、サンプル3ページ目の棒グラフの元になります。いちばん多い日(13日の911件)は MAX 関数で出せます。一方で「セール明け」「シフトを2名増やした」は元データにないので、人が書きます。
4ページ目の問い合わせの内訳(名前付き範囲 breakdown)は、問い合わせ管理ツールの書き出しを別の元データのシートに取り込み、同じように QUERY で分類ごとに数えます。分類は、生成AIの下書きを担当者が確かめたものを使います。
月の合計は SUMIFS で出す
対応件数の月の合計は、次の式で出します(SUMIFS、EDATE)。
=SUMIFS(元データ!D:D, 元データ!A:A, ">="&target_month, 元データ!A:A, "<"&EDATE(target_month,1))
応答率は応答数の合計 ÷ 入電数の合計、平均処理時間は処理時間の合計 ÷ 対応件数で出します。直近6か月の推移は、target_month を EDATE で1か月ずつずらした6行の表にすると、表の大きさが毎月変わらず、グラフの範囲も直さずに済みます。
ピボットテーブル([挿入]→[ピボット テーブル])でも集計でき、元のデータを変えると更新されます(Google「ピボット テーブルを作成、使用する」)。ただ、分類が増えると行の数や並びが変わるので、報告書の枠に運ぶ数字は QUERY と SUMIFS で作り、ピボットテーブルは中身を確かめる用に使います。
確認のセルを置き、合わないときは GAS を止める
集計のシートに次の2つを確かめる式を置き、両方を満たすと TRUE になるセルに ready と名前を付けます。
- 月末の日付の行が、元データにちょうど1行ある:
=COUNTIF(元データ!A:A, EOMONTH(target_month,0))=1。0なら取り込み前、2なら同じ月を二重に取り込んでいます - QUERY で出した日別の合計と、SUMIFS で出した月の合計が同じ
GAS は、ready が TRUE でなければ止まるように書きます(手順2)。2つめの確認を置く理由は、後の「壊れやすいところ」で説明します。
手順2:GASで、毎月の報告書を複製して数字を入れるには?
集計のファイルを開き、[拡張機能]→[Apps Script]でエディタを開きます。ここで作ったスクリプトはファイルに結び付き(コンテナ バインド スクリプト)、ドライブの一覧には出てきません(Google「Container-bound Scripts」)。
次のコードを貼り、先頭の3つの ID を自分のファイルとフォルダのものに書き換えます。ID は、URL の「/d/」の後ろ(フォルダは「/folders/」の後ろ)の文字列です。
// 集計のファイルの Apps Script に書く
const SOURCE_ID = '集計のファイルのID';
const TEMPLATE_ID = '報告書のひな形のファイルのID';
const FOLDER_ID = '保存先のフォルダのID';
const RANGES = ['target_month', 'kpi', 'trend', 'daily', 'breakdown', 'quality']; // 集計とひな形に同じ名前で作る
function makeMonthlyReport() {
const now = new Date();
const month = new Date(now.getFullYear(), now.getMonth() - 1, 1); // 先月の1日
const label = Utilities.formatDate(month, Session.getScriptTimeZone(), 'yyyy-MM');
const props = PropertiesService.getScriptProperties();
if (props.getProperty('REPORT_MONTH') === label) throw new Error(label + ' の報告書はもう作ってあります');
const src = SpreadsheetApp.openById(SOURCE_ID);
src.getRangeByName('target_month').setValue(month); // 集計の対象月を先月にする
SpreadsheetApp.flush();
if (src.getRangeByName('ready').getValue() !== true) throw new Error('集計の確認のセル ready が TRUE ではありません');
const copy = DriveApp.getFileById(TEMPLATE_ID).makeCopy(label + '_月次業務報告書', DriveApp.getFolderById(FOLDER_ID));
const dst = SpreadsheetApp.openById(copy.getId());
for (const name of RANGES) {
const from = src.getRangeByName(name);
const to = dst.getRangeByName(name);
if (!from || !to) throw new Error('名前付き範囲がありません:' + name);
to.setValues(from.getValues());
}
props.setProperty('REPORT_MONTH', label);
props.setProperty('REPORT_ID', copy.getId());
}
上から順に、次のことをしています。
- 前の月の1日を対象月にし、「2026-10」のようなラベルを作る(
Utilities.formatDate) - 作った月をスクリプト プロパティに記録しておき、同じ月なら止める(2回作らないため)
- 集計の target_month を書き換え、
SpreadsheetApp.flush()で反映してから、確認のセル ready を見る - ひな形を
makeCopyで複製し、名前付き範囲ごとにgetValuesで読んでsetValuesで書き込む。範囲がないとgetRangeByNameは null を返すので、名前を出して止める
setValues は、書き込む先の範囲と同じ大きさの2次元配列を求めます(Google「Class Range」)。集計とひな形で、同じ名前の範囲の行数と列数をそろえておきます。書き込むのは値だけなので、%や桁区切りの表示形式はひな形のセルに付けておきます。
最初の1回は、エディタで makeMonthlyReport を選んで手で実行し、表示される画面でアクセスを許可します。トリガーから動くときは許可の画面を出せないためです。あとから Gmail を使う関数を足したときも、もう一度手で実行して許可します(Google「Troubleshooting」)。
試すときは、集計とひな形のコピーと空のフォルダを作り、その ID で動かします。できた報告書の数字が集計と同じか、グラフが新しいファイルの数字を指しているかを見ます。
タイムゾーンをそろえる
スクリプトのタイムゾーン(エディタの左の[プロジェクト設定])と、スプレッドシートのタイムゾーン([ファイル]→[設定])を、どちらも日本時間にそろえます(Google「プロジェクト」、スプレッドシートの地域と計算の設定)。公式リファレンスにも、2つのタイムゾーンの違いはスクリプトのバグのよくある原因だと書かれています(Class Session)。ずれていると、対象月のセルに入る日付がずれることがあります。
手順3:PDFにしてドライブに保存し、下書きメールを作るには?
報告書に数字が入ったら、担当者が数字を元データと突き合わせ、各ページの見出しと所見を書きます。

サンプル5ページ目の折れ線は、名前付き範囲 quality の6か月分の数字から GAS が埋められます。右の「改善の理由」(回答テンプレートの整備、9月の新人の配属)は、元データからは出てきません。所見の下書きを生成AIに頼む方法は「生成AIでレポートの所見を下書きする方法」にまとめています。
所見を書き終えたら、次の2つの関数を使います。どちらも手順2と同じエディタに書き足します(FOLDER_ID などの定数を共有するため)。まず、報告書を PDF にして保存先のフォルダに置く関数です。
// 手順2の makeMonthlyReport が記録したファイルを PDF にして、保存先のフォルダに置く
function savePdf() {
const props = PropertiesService.getScriptProperties();
const label = props.getProperty('REPORT_MONTH');
const report = DriveApp.getFileById(props.getProperty('REPORT_ID'));
const pdf = report.getAs(MimeType.PDF).setName(label + '_月次業務報告書.pdf');
return DriveApp.getFolderById(FOLDER_ID).createFile(pdf);
}
次に、決まった宛先に、PDF を添付したメールの下書きを作る関数です。
// 所見を書き終えたら、エディタでこの関数を選んで実行する。送信はしない
const TO = '[email protected]'; // 委託元の担当者のアドレス
function createDraft() {
const label = PropertiesService.getScriptProperties().getProperty('REPORT_MONTH');
const pdf = savePdf(); // PDF をフォルダに保存してから添付する
const subject = '【月次業務報告書】' + label + ' 分のご報告';
const body = [
'ご担当者様',
'',
label + ' 分の月次業務報告書を添付いたします。',
'ご確認のほど、よろしくお願いいたします。',
].join('\n');
GmailApp.createDraft(TO, subject, body, { attachments: [pdf.getBlob()] });
}
createDraft を実行すると、中で savePdf も呼ばれ、PDF の保存と下書きの作成が1回で終わります。
- savePdf は、手順2で記録したファイルの ID から報告書を開くので、担当者が報告書のファイル名を変えても動きます
getAsは、ファイルを指定した形式に変換します。引数は変換先の形式だけで、用紙の向きや余白を指定する引数はありません(Google「Class File」)。最初の数か月は、できた PDF を必ず開いて、ページの切れ方とグラフを確かめますGmailApp.createDraftは、4つ目の引数の attachments で添付できます。公式の例も、ドライブのファイルを PDF にして添付しています(Google「Class GmailApp」)
GmailApp には送信する sendEmail もありますが、宛先・添付・本文を人が見てから送るため、下書きにとどめます。下書きは、関数を実行した人の Gmail の[下書き]に入ります。
手順4:時間主導型トリガーの設定と、止まったときの気づき方
トリガーを作る
makeMonthlyReport を毎月決まった日に動かすには、時間主導型トリガーを作ります。画面で作るときは、エディタの左の[トリガー]を開き、右下の[トリガーを追加]から、実行する関数に makeMonthlyReport を選び、時間主導型で毎月の日と時刻を指定して[保存]します(Google「インストール可能なトリガー」)。
コードで作る場合は、次の関数を1回だけ実行します。
// 1回だけ実行する。毎月3日の9時台に makeMonthlyReport を動かす
function createTrigger() {
ScriptApp.newTrigger('makeMonthlyReport').timeBased().onMonthDay(3).atHour(9).create();
}
実行するたびにトリガーが1つずつ増えるので、[トリガー]の画面で1つだけになっているかを見ます。日にちは、元データがそろう日より後にします(この例では、CSV を2日までに取り込む前提で3日)。時刻は多少ずれ、9時に設定すると9時から10時のあいだで動きます(同じページ)。
止まったときは、どこで気づく?
インストール可能なトリガーで動いた関数が失敗しても、画面にエラーは出ません。代わりに、次のような場所で気づきます。
| 気づく場所 | わかること |
|---|---|
| 失敗の通知メール(差出人 [email protected]、件名 Summary of failures for Apps Script) | 失敗したこと。リンクからトリガーを止めたり、スクリプトを開いたりできる |
| エディタの左の[実行] | 実行ごとのログとエラーの文(コードで止めたときの「集計の確認のセル ready が TRUE ではありません」も出る) |
| script.google.com の[マイ実行] | 実行ごとの状態(Completed・Failed・Running) |
| 保存先のフォルダ | 4日の朝に、その月の報告書のファイルがあるか |
通知の頻度は、トリガーが有効なあいだは変えられます(同じページ)。締め日に間に合う頻度を選び、だれがそのメールを見るかを決めておきます。いちばん確実な目印はフォルダの中の報告書なので、毎月の手順に「4日の朝にフォルダを見る」を入れます。
また、トリガーは作った人のアカウントで動き、ほかのアカウントからは見えません(同じページ)。どのアカウントで作ったかを説明のシートに書いておきます。
上限は公式の割り当てページで確かめる
主な上限は次のとおりです(Google「Google サービスの割り当て」、2026年11月3日に確認)。上限は予告なく変わることがあります。
| 項目 | 一般のアカウント(gmail.com など) | Google Workspace のアカウント |
|---|---|---|
| 1回の実行時間 | 6分 | 6分 |
| トリガーで動く時間の合計 | 1日90分 | 1日6時間 |
| トリガーの数 | 1人・1スクリプトあたり20個 | 1人・1スクリプトあたり20個 |
| ファイルの変換(getAs の PDF など) | 1日2,000件 | 1日4,000件 |
上限を超えると例外になり、実行はそこで止まります。委託元ごとに繰り返す形に広げるときは、6分に収まるかをテスト用のファイルで確かめます。
壊れやすいところは?列の追加・シート名・持ち主の退職
作った直後は動いていても、数か月後に止まったり、止まらずに違う数字を出したりします。気をつけたいのは後者です。エラーにならないので、だれも気づかないまま委託元に届くおそれがあります。

| 原因 | 起きること | 防ぎ方 |
|---|---|---|
| 元データの途中に列を挿入した(例:B 列に「担当チーム」) | クエリは文字列なので「sum(D)」のまま。D 列に移った応答数を合計し、エラーにならない | 列は右端に足す。SUMIFS は範囲で指すので一緒にずれ、QUERY との合計が合わなくなる。確認のセルで GAS を止める |
| シート名・セルの位置・名前付き範囲を変えた | 番地を書いたコードは違うセルに書き込む。名前付き範囲がないと「名前付き範囲がありません:daily」で止まる | 名前付き範囲で指し、名前の一覧を説明のシートに書く |
| 同じ月の CSV を2回取り込んだ | 二重に数え、エラーにならない | 確認のセル(月末の行がちょうど1行)で止める |
| スクリプトとスプレッドシートのタイムゾーンが違う | 日付がずれ、対象月の数字が変わることがある | 両方を日本時間にそろえる |
| 作った人の異動・退職 | トリガーはその人のアカウントで動き、ほかの人からは見えない | 引き継ぐ人がトリガーを作り直す(次の節) |
作った人が抜けても回るように
ファイルは、担当者の個人のアカウントではなく会社のアカウントで作ります。共有ドライブのファイルはチームが所有し、作ったメンバーのアカウントが削除されても残ります(Google「共有ドライブとは」)。ただし、この記事のコードで使う DriveApp の公式リファレンスは、共有ドライブには高度なドライブ サービスを使うよう案内しています(Google「Class DriveApp」)。共有ドライブに置くなら、テスト用のフォルダで動くかを確かめてから使います。
トリガーは作り直しが要ります。引き継ぐ人が自分のアカウントで makeMonthlyReport を一度手で実行して許可し、トリガーを作ります。元の担当者のトリガーは、その人が script.google.com の[マイ トリガー]から削除します。両方残すと同じ月に2回動きます(2回目は「もう作ってあります」で止まります)。外注先から仕組みを受け取るときの持ち主の確かめ方は、「レポートの自動化を外注する:仕組みごと納品してもらうときの確認項目」にまとめています。
説明のシートに書くこと
集計のファイルの先頭に説明のシートを置き、次の担当者がそれだけ読めば1か月分を回せるようにします。
- 毎月の手順:2日までに CSV を取り込む、4日の朝に報告書を見る、所見を書いたら createDraft を実行する、下書きを確かめて送る
- ファイルとフォルダの ID、名前付き範囲の一覧、元データの列の一覧と「列は右端に足す」
- トリガーを作ったアカウントと、通知メールを見る人
- 止まったとき:通知メール →[実行]のログ → 今月分は手で作って出す → 原因を直す
自分で作るのが難しいときは?仕組みづくりを頼む・作成を任せる
名前付き範囲の設計、確認のセル、トリガーの持ち主まで含めると、最初に決めることは多くあります。社内に JavaScript を読める人がいない、作った人が異動したら止まりそう、という場合は、次の2つの頼み方があります(おまかせレポートはどちらも受けています)。
- 自動化の仕組みづくりを頼む:個別見積りです。御社のスプレッドシートとアカウントで動く仕組みを作り、手順書と一緒に仕組みごと納品します(月額の保守はありません)。毎月の CSV の取り込み、確認と所見、送信は社内に残ります
- 作成そのものを任せる:初期費用0円、基本料金 月額3万円(税別、5件まで)、6件目から1件 月5,000円、最低契約期間6ヶ月(7ヶ月目から1ヶ月単位で解約可)です。データを共有ドライブに入れていただくだけで、御社の型のまま作ります。所見は下書きとしてお出しし、御社が確かめて御社の名前で出します
頼む前に、今の報告書を宛先・件数・元データ・締め日で書き出しておくと、依頼の内容を伝えやすくなります。書き出す用紙として、レポート作成・自動化の依頼シート(Excel・無料)を用意しています。
BPO・業務委託の会社の、委託元ごとの月次業務報告は、BPO・業務委託の月次報告書の作成代行で、扱える報告書と料金の例を載せています。
おまかせレポートでは、今の報告書を1本お預かりして、同じ型で1回分を作る無料のお試しを受け付けています。スプレッドシートと GAS で動く仕組みを作って受け取りたい場合の相談も、同じフォームから受け付けています。
よくある質問
Q.GASでメールの送信まで自動にしないのはなぜですか?
GmailApp には送信のメソッドもありますが、所見や数字を人が確かめる前に宛先へ届くおそれがあるため、この記事では下書きの作成にとどめています。下書きは関数を実行した人の Gmail に入るので、宛先・添付・本文を開いて確かめてから送ります。
Q.トリガーが動いたかどうかは、どこで確かめられますか?
失敗したときは Apps Script から失敗をまとめたメールが届きます。成功・失敗の履歴は、エディタの左の[実行]や、script.google.com の[マイ実行]で見られます。いちばん確実なのは、決まった日に保存先のフォルダにその月の報告書ができているかを見ることです。
Q.GASを作った担当者が異動・退職するときは、何をすればいいですか?
インストール可能なトリガーは作った人のアカウントで動き、ほかのアカウントからは見えません。引き継ぐ人が自分のアカウントで関数を一度手で実行して許可し、トリガーを作り直してから、元のトリガーを削除します。ファイルは個人ではなく会社のアカウントで持ちます。
Q.Excelとスプレッドシートのどちらで自動化すればいいですか?
社内でExcelを使い、CSVを手元のフォルダで受け取るならExcelのPower Queryと関数が向きます。Google Workspaceを使い、決まった日に報告書を作ってPDFやメールの下書きまでつなげたいなら、スプレッドシートとGASが向きます。迷ったら、作った後に社内で直せる人がいるほうを選びます。
Q.委託元や店舗が複数あるときも、同じ作り方でできますか?
できます。元データに委託元の列を右端に足してQUERYの条件に加えるか、委託元ごとに集計のファイルを分けます。繰り返す数が増えるほど1回の実行が長くなるので、6分の上限に収まるかをテスト用のファイルで確かめます。