こんにちは、こんです🦊
今日は、現場で意外と時間を食っていた佐川急便「配送ストップ依頼FAX」の作成業務を自動化するツールを作った話です。
これまで、Googleスプレッドシートで管理していた出荷情報をもとに、毎回手作業でPDFを作成し、FAX送信していたのですが、「これそろそろ限界では?」と思い立ち、GAS(Google Apps Script)とChatGPTを使って内製化にチャレンジしてみました。
実験のきっかけ:アナログ運用による“ムダの積み重ね”
毎回PDFをテンプレに手でコピペして作るのが面倒
注文数が多いと、複数ページのPDFを手動で分ける必要がある
送信済みかどうかの管理がバラバラで、抜け漏れが起きがち
FAXというレガシーな運用はすぐには変えられないけど、「その前段階ぐらいは自動化できるのでは?」と考え、スクリプト化することにしました。
作ってみたもの(システムの概要)
今回はこんな仕組みを構築しました:
✅ ステータスが「要送信」の注文だけを抽出して自動処理
✅ 注文15件ごとに1ページになるようにテンプレートシートを複製
✅ 出荷日・伝票番号・氏名をテンプレートに差し込んでPDF出力
✅ PDFは1ファイルにまとめて出力、ファイル名も自動で命名
✅ 送信後、該当注文に「FAX送信日」「確認予定日」を自動入力
コードはすべてGASで構築しましたが、ChatGPTに構文や構造を相談しながら進めたことで、短時間で安定稼働する仕組みが整いました。
実感したメリット
1. 手作業ゼロで、送信前のPDFが完成!
毎回の転記作業がなくなり、該当注文を選んでボタンを押すだけでPDFが完成します。1件でも20件でも対応可能なので、作業量がほぼゼロになりました。
2. 書式ズレ・入力ミスが発生しなくなった
テンプレートは固定レイアウト、差し込むデータも正規フォーマットなので、整った出力が常に保証されます。「あれ?伝票番号間違えた?」みたいなヒューマンエラーが消えました。
3. 一覧への記録も自動なので、トラッキングもスムーズに
出力後に「FAX送信日」と「確認予定日」が自動で入るため、担当が交代しても進捗状況を一覧で把握できます。属人化も防げて安心。
構築事例
【出荷停止依頼一覧】:注文ごとのステータス管理と出力対象判定(ステータス=要送信)
【テンプレート】:FAX出力フォーマット。1ページに15件分の出荷情報を配置
【PDF出力ボタン】:GAS実行トリガー。実行するとPDFが自動生成される
function exportStopRequestsAsPDF() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const listSheet = ss.getSheetByName("配送停止依頼一覧");
const templateSheet = ss.getSheetByName("テンプレート");
const dataRange = listSheet.getDataRange();
const data = dataRange.getValues();
const headers = data[0];
const rows = data.slice(1);
const today = new Date();
const yymmdd = Utilities.formatDate(today, "Asia/Tokyo", "yyMMdd");
const todayStr = Utilities.formatDate(today, "Asia/Tokyo", "yyyy/MM/dd");
const tomorrow = new Date(today);
tomorrow.setDate(today.getDate() + 1);
const tomorrowStr = Utilities.formatDate(tomorrow, "Asia/Tokyo", "yyyy/MM/dd");
// ✅ ステータスが「要送信」のみ対象
const targetRows = rows
.map((row, i) => ({ row, index: i + 1 })) // index = スプレッド上の行番号(2行目以降)
.filter(({ row }) => row[0] === "要送信");
if (targetRows.length === 0) {
SpreadsheetApp.getUi().alert("ステータスが「要送信」のデータがありません。");
return;
}
const maxRowsPerPage = 15;
const totalPages = Math.ceil(targetRows.length / maxRowsPerPage);
// ✅ 一時スプレッドシート作成
const tempSpreadsheet = SpreadsheetApp.create("配送ストップFAX一時ファイル");
const defaultSheet = tempSpreadsheet.getSheets()[0];
const sheetList = [];
for (let p = 0; p < totalPages; p++) {
const newSheet = templateSheet.copyTo(tempSpreadsheet);
newSheet.setName(`依頼_${p + 1}`);
sheetList.push(newSheet);
newSheet.getRange("I3").setValue(`${p + 1}/${totalPages}枚目`);
newSheet.getRange("I4").setValue(Utilities.formatDate(today, "Asia/Tokyo", "yyyy/M/d"));
const pageRows = targetRows.slice(p * maxRowsPerPage, (p + 1) * maxRowsPerPage);
pageRows.forEach(({ row }, i) => {
const bRow = 33 + i;
newSheet.getRange(`C${bRow}`).setValue(row[2]); // 出荷日
newSheet.getRange(`E${bRow}`).setValue(row[4]); // 伝票番号
newSheet.getRange(`G${bRow}`).setValue(row[3]); // 氏名
});
}
tempSpreadsheet.deleteSheet(defaultSheet);
// ✅ 1ファイルにまとめてPDF出力(複数シートを対象に)
const exportUrl = `https://docs.google.com/spreadsheets/d/${tempSpreadsheet.getId()}/export?exportFormat=pdf&format=pdf` +
`&size=A4&portrait=true&fitw=true&scale=4` +
`&sheetnames=false&printtitle=false&pagenumbers=false&gridlines=false&fzr=false` +
`&top_margin=0.5&bottom_margin=0.5&left_margin=0.5&right_margin=0.5`;
const token = ScriptApp.getOAuthToken();
const response = UrlFetchApp.fetch(exportUrl, {
headers: { Authorization: 'Bearer ' + token }
});
const blob = response.getBlob().setName(`${yymmdd}_配送ストップ依頼FAX_${targetRows.length}件.pdf`);
const folder = DriveApp.getFolderById("フォルダのIDを挿入");
folder.createFile(blob);
// ✅ 出荷停止依頼一覧のFAX送信日(G列)と確認予定日(H列)を更新
targetRows.forEach(({ index }) => {
listSheet.getRange(index + 1, 7).setValue(todayStr); // G列 = 7
listSheet.getRange(index + 1, 8).setValue(tomorrowStr); // H列 = 8
});
// ✅ 一時ファイル削除
DriveApp.getFileById(tempSpreadsheet.getId()).setTrashed(true);
SpreadsheetApp.getUi().alert("PDF出力+一覧更新が完了しました!");
}
次回予告:FAX送信もAPIでやってみたい!
今回は「PDF出力まで」を自動化しましたが、次はその先の「FAX送信」自体も自動化できないか試してみたいと思っています。
ステップ1:eFaxなどのAPI接続方法を調査
ステップ2:出力済PDFを自動でAPIに投げる処理の実装
ステップ3:送信結果のログ取得 → ステータス更新の仕組み構築
FAX文化から完全脱却するのは難しくても、「送信業務を見えないところで自動化する」ことは十分可能だと感じています。
まとめ:GAS × テンプレで“紙FAX”も自動化できる
今回の実験では、ずっと「面倒だな〜」と思っていたFAX依頼業務を、15行単位でテンプレートに差し込む形式で自動PDF化し、一覧への記録まで完結する仕組みを構築しました。
ノーコードというよりは「ローコード」寄りでしたが、ChatGPTを相棒にすれば業務を止めずに仕組み化できることを、改めて実感しました。
FAXもシステム化できるなら、まだまだ自動化できる仕事はたくさんあるな、と。
それでは、また次の実験で!🦊
#ノーコード #業務改善 #GAS #ChatGPTで業務効率化 #レガシー業務の自動化