皆さんこんにちは、横浜で清掃業をしているヤスです。
前回は【Dify中級】銘柄コードを入れるだけ!株価自動取得+財務健全性診断+投資判断サマリーを自動生成
のアプリを作りましたね。今回はこちらです。
1. 備品申請の事務作業を完全自動化します
備品を購入したいとき「稟議書をWordで作って→上司にメールして→カレンダーに承認期限を登録して」という作業に毎回20〜30分かかっていませんか?このアプリはその作業をゼロにします。
今回紹介する「備品購入申請くん」は、チャットで備品名・金額・理由を入力するだけで以下を全自動で実行します。
- AIが説得力のある稟議書を自動生成(購入理由を論理的に補強)
- 承認者にGmailで承認依頼メールを自動送信
- Googleカレンダーに承認期限(3日後)を自動登録
- 発注先候補(Amazonビジネス・アスクル・モノタロウなど)をリストアップ
実際に「業務用高圧洗浄機・58,000円・水圧が落ちて清掃時間が1.5倍かかっている」という入力でテストしたところ、Gmailに稟議書が届き・Googleカレンダーの3日後に承認期限が登録されました。
⚠️ このアプリはDify(AIワークフロー)とGoogle Apps Script(GAS)の2つを連携させます。GASはGoogleアカウントがあれば無料で使えます。
2. DifyとGASの役割分担
| ツール | 役割 | やること |
| Dify | AIの頭脳 | 稟議書の生成・データの整形・GASへの送信 |
| GAS | Googleとの橋渡し | Gmail送信・カレンダー登録 |
💡 GASはAPIキーなしで使えます。DifyからGASへデータを投げるだけなのでGoogle側の認証は不要です。ただしデプロイ設定を間違えると401エラーになります(後述)。
3. 全体のブロック構成
開始ブロック(変数3つ:備品名・金額・購入理由) ↓ LLMブロック(稟議書+発注先候補を生成) ↓ HTTPリクエストブロック(GASにデータを送信) ↓ 終了ブロック(完了メッセージを表示) GAS側: POSTリクエストを受信 → Gmailで承認依頼メールを送信 → Googleカレンダーに3日後の期限を登録 → Difyに「Success」を返す
4. 【作り方】STEP1:Difyのワークフローを設定する
開始ブロック(変数3つ)
| 変数名 | 表示名 | 種類 | 必須 |
| item_name | 備品名 | テキスト(短文) | ✅ 必須 |
| price | 金額(円) | 数値(Number) | ✅ 必須 |
| reason | 購入理由 | テキスト(長文) | ✅ 必須 |
⚠️ 金額(price)は種類を「数値(Number)」にしてください。テキストにするとカンマや「円」が混入してGAS側の処理に影響することがあります。
LLMブロック(稟議書生成)
モデル:GPT-4o / temperature:0.3に設定してください。プロンプトは以下の通りです。
# 指示 あなたは優秀な総務・経理アシスタントです。 提供された【入力情報】をもとに、上司の承認を スムーズに得るための稟議書を作成し、 発注先候補を提案してください。 # 制約条件 ・トーンはビジネス向けの丁寧でフォーマルな表現 ・購入理由は業務へのメリットが伝わるよう補足する ・発注先は法人向け通販サイトから現実的なものを3つ ・余計な挨拶や解説は省き出力フォーマット通りに出力 # 入力情報 ・備品名:{{開始.item_name}} ・金額:{{開始.price}}円 ・購入理由:{{開始.reason}} # 出力フォーマット 【備品購入稟議書】 ■ 申請品目:[備品名] ■ 概算費用:[金額]円 ■ 申請理由・目的: [購入理由を論理的に膨らませた文章] 【おすすめの発注先候補】 1. [候補1]:[選定理由] 2. [候補2]:[選定理由] 3. [候補3]:[選定理由]
💡 プロンプトを「# 指示・# 制約条件・# 入力情報・# 出力フォーマット」の4ブロックに分ける設計はプロンプトエンジニアリングの基本です。AIが混乱せず安定した出力を出します。
HTTPリクエストブロック(GASへデータ送信)
💡 DifyのHTTPリクエストブロックの基本設定はこちらの記事で詳しく解説しています
【Dify】スプレッドシート連携・完結編!HTTPリクエストでデータを飛ばそう
メソッド:POST URL:GASのウェブアプリURL(後述) ボディ:JSON を選択 { “item_name”: “{{開始.item_name}}”, “llm_output”: “{{LLMブロック.text}}” }
5. 【作り方】STEP2:GASでGmail+カレンダー連携を設定する
GASのコードを書く
- Googleドライブを開いて「新規」→「Google Apps Script」を選ぶ
- 最初からあるコードを全部削除する
- 以下のコードを貼り付ける
// DifyからのPOSTリクエストを受け取る関数 function doPost(e) { // 受け取ったデータをJSONに変換する let data = JSON.parse(e.postData.contents); // 備品名とAIが作った稟議書を取り出す let itemName = data.item_name; let documentText = data.llm_output; // 承認者のメールアドレスを設定する(実際のアドレスに変更) let bossEmail = “boss@example.com”; // メールの件名を設定する let subject = “【承認依頼】備品購入申請:” + itemName; // Gmailで承認依頼メールを自動送信する GmailApp.sendEmail(bossEmail, subject, documentText); // 今日の日付を取得して3日後を計算する let today = new Date(); let deadline = new Date( today.getTime() + (3 * 24 * 60 * 60 * 1000) ); // Googleカレンダーに3日後の期限を終日予定で登録する let calendar = CalendarApp.getDefaultCalendar(); calendar.createAllDayEvent(“承認期限:” + itemName, deadline); // Difyに成功の合図を返す return ContentService.createTextOutput(“Success”); }
⚠️ bossEmail = “boss@example.com” の部分を実際の承認者のメールアドレスに変更してください。
GASをウェブアプリとして公開する
- 右上の青い「デプロイ」ボタンをクリック
- 「新しいデプロイ」を選ぶ
- 歯車マーク→「ウェブアプリ」を選ぶ
- 以下の設定にする
| 設定項目 | 設定値 |
| 次のユーザーとして実行 | 自分(自分のメールアドレス) |
| アクセスできるユーザー | 全員 |
- 「デプロイ」をクリック
- Googleアカウントのアクセス許可を与える
- 表示された「ウェブアプリのURL」をコピーする
⚠️ URLの最後が「/exec」で終わっているか確認してください。「/dev」で終わるURLはテスト用で外部からアクセスできません。
DifyのHTTPリクエストブロックにURLを貼り付ける
コピーしたGASのウェブアプリURL(/execで終わるもの)をDifyのHTTPリクエストブロックのURLに貼り付けてください。
6. 【正直レポート】401エラーで詰まった全記録
このアプリを作る過程で401エラーに何度もぶつかりました。同じ問題で詰まる読者のために全て公開します。
発生した401エラーと原因・解決方法
| エラーの状況 | 原因 | 解決方法 |
| GASにDifyからアクセスできない | 「アクセスできるユーザー」が「全員」になっていなかった | 「全員」に変更して再デプロイ |
| URLを貼り付けても401が続く | テスト用の「/dev」URLを使っていた | 本番用「/exec」URLに変更 |
| 「次のユーザーとして実行」の設定ミス | 「ウェブアプリにアクセスしているユーザー」になっていた | 「自分」に変更して再デプロイ |
💡 401エラーはDify側(OpenAI APIキー)ではなくGAS側のデプロイ設定が原因であることがほとんどです。APIキーを疑う前にGASの設定を確認しましょう。
カレンダーに予定が見つからない問題
テスト日:5月31日 カレンダーに登録される日:6月3日(3日後) →「今日(5月31日)」を見ていたため見つからなかった →「3日後(6月3日)」の終日予定欄を確認したら登録されていた GASのコード: let deadline = new Date( today.getTime() + (3 * 24 * 60 * 60 * 1000) ); → 今日+3日 = 3日後に登録される設計

7. テスト実行と確認ポイント
以下のテストデータで実行してください。
| 項目 | 入力内容 |
| 備品名 | 業務用高圧洗浄機 |
| 金額 | 58000(数字のみ・円なし) |
| 購入理由 | 現在使用している洗浄機の水圧が落ちており、清掃作業に従来の1.5倍の時間がかかっている。業務スピードの改善とサービス品質維持のために早急な買い替えが必要 |
- LLMブロック:稟議書が「■ 申請品目・■ 概算費用・■ 申請理由」の形式で出力されているか
- LLMブロック:発注先候補が3つリストアップされているか
- HTTPリクエスト:GASから「Success」が返ってきているか
- Gmail:承認者のメールに「【承認依頼】備品購入申請:業務用高圧洗浄機」が届いているか
- Googleカレンダー:3日後の日付に「承認期限:業務用高圧洗浄機」が登録されているか
⚠️ カレンダーを確認する際は「今日」ではなく「3日後」の日付を確認してください。終日予定として登録されるためカレンダーの一番上の行に表示されます。

8. よくある質問(FAQ)
Q1. GASは無料で使えますか?
Googleアカウントがあれば完全無料で使えます。Gmail送信やカレンダー登録は1日あたりの制限はありますが、社内の備品申請用途なら十分すぎる上限です。
Q2. 承認者のメールアドレスを変更したい場合は?
GASのコードの「bossEmail = ‘boss@example.com’」の部分を実際のメールアドレスに変更して再デプロイしてください。開始ブロックに変数として追加することで実行時に指定できるようにすることも可能です。
Q3. 承認期限を3日後から変更したい場合は?
GASのコードの「3 * 24 * 60 * 60 * 1000」の「3」の部分を変更してください。5日後にしたい場合は「5」に変えてください。
Q4. DifyのAPIキーはGASに設定する必要はありますか?
不要です。DifyからGASへデータを投げる一方向の連携なのでGAS側にDifyのAPIキーを設定する必要はありません。GASのデプロイを「アクセスできるユーザー:全員」にすることで認証なしでDifyからアクセスできます。

9. さらに便利にする3つのカスタマイズ
① 金額によって承認ルートを変える
Difyのワークフローに条件分岐ブロックを追加することで「10万円未満は課長承認・10万円以上は部長承認」という分岐が可能です。GASの送信先メールアドレスを条件によって変えることで実現できます。
② Slackにもリアルタイム通知する
GASのコードにSlack Webhook URLへのフェッチを追加することで「メール送信と同時にSlackの承認チャンネルにも通知」という二重通知が実現できます。
③ Notionに申請履歴を自動保存する
DifyのワークフローにNotionへのHTTPリクエストを追加することで全ての申請が自動的にNotionの申請台帳データベースに蓄積されます。
10. まとめ
- チャットで備品名・金額・理由を入力するだけで稟議書生成・Gmail送信・カレンダー登録が全自動完了
- GASはAPIキー不要・完全無料。デプロイ設定(/exec・全員・自分として実行)の3点が重要
- 401エラーはDify側ではなくGAS側のデプロイ設定が原因であることがほとんど
- カレンダーの確認は「今日」ではなく「3日後」の日付を確認する
- プロンプトを「指示・制約条件・入力情報・出力フォーマット」の4ブロックに分けることで安定した稟議書が生成される
稟議書作成・メール送信・カレンダー登録という3つの事務作業が完全自動化されます。
メールの文章自体が稟議書なので別のファイルで必要ならコピーして作ってみてください
久しぶりにGAS連携のアプリを作りました。最初はClaudで作っていたのですが
的外れな答えが来たのでジェミニに切り替えて作り直したらGASを使った
作成方法を提案してきたので全然楽に作れました。ちょっとつまずきましたが、
Claudでやってたらおおはまりしたと思います。使い分けが大事ですね。
次におすすめの記事
目次を入れるだけ!Kindle電子書籍の全自動執筆&保存AIの作り方
xもやってるので良かったら見に来てください


コメント