【Dify×GAS】妻を論破!高額ガジェットの「家族稟議書」全自動生成アプリの作り方

DifyとGoogle Apps Script(GAS)を活用し、高額ガジェット購入のための「家族稟議書」を全自動生成するアプリの作り方を解説したブログ第111話のアイキャッチ画像。和室で正装した49歳の男性(Yasu)が、光り輝く「家族提案書」を妻へ恭しく差し出し、それを受け取った妻が納得の表情で印鑑を押そうとしている、ユーモア溢れるドラマチックなイメージ図。 Uncategorized

皆さんこんにちは、横浜で清掃業を営む49歳、ヤスです。

前回は顔出し不要!YouTubeショート動画の「台本&画像プロンプト」全自動生成

のアプリを作りましたね。

突然ですが、自分のためのお金、自由に使えていますか? 「AIの有料プランに入りたい」「新しいキャンプギアが欲しい」……そんな大人の欲望を満たすための最大の障壁は、クライアントでもエラーコードでもなく、「妻の決裁(お小遣いアップの許可)」ですよね。

そこで今回は、AIの力を使って**「ただ自分が欲しいだけの理由」を「家族の未来と笑顔のための投資」へと見事にすり替え、有無を言わさぬ完璧な『家族稟議書』を全自動で生成するアプリ**を作りました!

途中で「目に見えないゴミ文字(スペース)」が原因の地獄のようなエラーにハマりましたが、それを根本から解決するプロの裏技も盛り込んでいます。中学生でも絶対に動かせるように解説しますので、一緒に作って奥様にハンコをもらいましょう!

【結論】 このアプリの仕組みは、「Dify(AI)」にあなたの本音を入力して凄腕コンサルタントに”家族へのメリット”に翻訳させ、「GAS」を経由してGoogleドキュメントの『稟議書』として全自動作成するという連携プレイです。

最大のポイントは、GASと連携する際によく起きる「フォルダIDのコピペミス(見えない空白が混ざってエラーになる現象)」を完全に防ぐため、「IDを使わず、フォルダの名前で直接探させる」という最新のGASコードを採用したことです。これでエラー発生率はほぼゼロになります!

【手順(ワークフローとGASの作り方)】

ステップ1:GASで「稟議書作成工場」を作る まずはデータを受け取ってドキュメントを作るGAS側の設定です。新規プロジェクトを開き、最初からある文字をすべて消して、以下のコードをコピペしてください。全行に分かりやすい解説をつけています。

JavaScript

// ▼▼▼ Difyからデータを受け取ってドキュメントを作るメインの窓口です ▼▼▼
function doPost(e) {
  // もし途中でエラーが起きてもパニックにならず、原因を報告するための安全装置です
  try {
    // Difyから送られてきたデータ(JSON形式)を、プログラムが読める形に翻訳します
    const params = JSON.parse(e.postData.contents);
    
    // 翻訳したデータの中から、AIが書いた「稟議書の本文」だけを変数(箱)に取り出します
    const proposalText = params.proposal;

    // ★【超重要】IDを使わず、フォルダの「名前」で直接探しに行きます!
    const folderName = "奥様説得ツール用";
    
    // Googleドライブ全体から、その名前のフォルダを探し出します
    const folders = DriveApp.getFoldersByName(folderName);
    
    // フォルダを入れておくための空の箱を準備します
    let folder;
    
    // もしその名前のフォルダが「すでに存在している」なら、それを使います
    if (folders.hasNext()) {
      folder = folders.next();
    } 
    // もし「存在していない」なら、GASが勝手に新しくフォルダを作ってくれます!
    else {
      folder = DriveApp.createFolder(folderName);
    }

    // 作成するGoogleドキュメントのファイル名を決めます(例:【家族稟議書】20260412)
    const fileName = "【家族稟議書】" + Utilities.formatDate(new Date(), "JST", "yyyyMMdd");
    
    // 新しいGoogleドキュメントをシステム上に作成します
    const doc = DocumentApp.create(fileName);
    
    // 作成したドキュメントの固有番号(ID)を控えておきます
    const docId = doc.getId(); 
    
    // ドキュメントの「本文」を編集するための準備をします
    const body = doc.getBody();

    // 一番上に、見出しとして稟議書のタイトルをデカデカと書き込みます
    body.insertParagraph(0, "■ 家族稟議書(決裁願い)").setHeading(DocumentApp.ParagraphHeading.HEADING1);
    
    // AIが考えた説得力MAXの本文を書き込みます(\n は改行という意味です)
    body.appendParagraph("\n" + proposalText);
    
    // 最後に、奥様がハンコを押す(サインする)ためのカッコいい決裁欄を作ります
    body.appendParagraph("\n--------------------------------------------------");
    body.appendParagraph("【決裁欄】 承認 ・ 却下 ・ 条件付き承認");
    body.appendParagraph(" 妻サイン:");
    body.appendParagraph("--------------------------------------------------");

    // すべての書き込みを終了して、ドキュメントをしっかり保存して閉じます
    doc.saveAndClose();

    // 先ほど控えた番号(ID)を使って、完成したドキュメントの「ファイル自体」を掴みます
    const file = DriveApp.getFileById(docId);
    
    // 掴んだファイルを、「奥様説得ツール用」フォルダの中に移動させます
    folder.addFile(file);
    
    // 元々あった場所(マイドライブの一番上)に残っている古いファイルを削除して整理整頓します
    DriveApp.getRootFolder().removeFile(file);

    // すべて大成功したら、Dify側に「無事に作成完了しました!」という報告を準備します
    const result = { status: "success", documentUrl: file.getUrl() };
    
    // 報告データをJSONという形式に整えて、Difyに送信して処理を終わります
    return ContentService.createTextOutput(JSON.stringify(result)).setMimeType(ContentService.MimeType.JSON);

  // 安全装置の後半:もしエラーが起きた場合の処理です
  } catch (error) {
    // 何がダメだったのか、エラーの原因をテキストにして準備します
    const errorResult = { status: "error", message: "GASのエラー原因: " + error.toString() };
    
    // エラー内容をDifyに送信して、どこを直せばいいか教えてあげます
    return ContentService.createTextOutput(JSON.stringify(errorResult)).setMimeType(ContentService.MimeType.JSON);
  }
}

⚠️ 忘れてはいけない「デプロイの儀式」 コードを貼り付けたら、画面右上の「デプロイ」>「新しいデプロイ」を開き、アクセスできるユーザーを**「全員」**にしてデプロイします。最後に発行されるURL(/execで終わるもの)をコピーしてください。

ステップ2:Difyの「開始」ブロック(入力設定) Dify側でワークフローを作成し、開始ブロックに以下の3つの変数を設定します。

  • item_name (テキスト型):欲しいもの(例:Dify Plusの有料プラン)
  • price (テキスト型):金額(例:月額3,000円)
  • true_reason (テキスト型):欲しい「本当の」理由(例:AIを使ってブログの作業を全部サボりたいから)
DifyワークフローのLLMノード(gpt-4o)設定画面。AIに「世界一の交渉人であり、家庭の平和を守る凄腕のコンサルタント」の役割を与え、ユーザーが入力した「欲しいもの(item_name)」「金額(price)」「本当の購入理由(true_reason)」を基に、妻が喜んで判を押したくなるような完璧な論理の【家族稟議書】を自動作成させるためのシステムプロンプト設定。導入から投資対効果(メリット)、結びまでを構造化して出力するロジック。

ステップ3:Difyの「LLM」ブロック(凄腕コンサルタントAI) あなたの欲望を、家族へのメリットに変換する魔法のプロンプトです。

Plaintext

# 指示
あなたは世界一の交渉人であり、家庭の平和を守る凄腕のコンサルタントです。
夫が「自分のために欲しいもの」を、妻が喜んで「これは家庭のために投資すべきだ!」と錯覚するような、完璧な論理の【家族稟議書】を作成してください。

# 申請内容
・購入希望品:{{#start.item_name#}}
・金額:{{#start.price#}}
・夫の本当の購入理由:{{#start.true_reason#}}

# 構成条件(以下の見出しに沿って出力すること)
1. 【導入】日頃の感謝と、妻の負担をいかに減らしたいかという熱い思い。
2. 【現状の課題】今のままでは家族との時間や、家計にマイナスであることを指摘。
3. 【投資対効果(メリット)】「夫の本当の購入理由」を深読みし、それが結果的に「妻の自由時間の増加」「将来の家計へのリターン」「家族の笑顔」に直結することを3つのポイントで論理的に力説する。
4. 【結び】家庭の未来のための前向きな決裁のお願い。

# 出力形式
・余計な挨拶は不要です。稟議書の本文(テキスト)のみを出力してください。
・丁寧で誠実、かつ少しクスッと笑えるようなユーモアを交えた文体にしてください。
Difyワークフローの「HTTPリクエスト」ノード設定画面。生成された「家族稟議書」の本文((x) text)を、Google Apps Script(GAS)経由でGoogleドキュメントへ書き出すための設定。メソッドを「POST」に指定し、ボディ(JSON)形式で、キー名「proposal」に稟議書の内容を格納して送信するAPI連携の構成。

ステップ4:Difyの「HTTPリクエスト」ブロック(GASへ送信)

  • メソッド:POST
  • URL:ステップ1でコピーしたGASのURL
  • ボディ:JSONを選択し、以下を貼り付けます。

JSON

{
  "proposal": "{{#llm.text#}}"
}
Difyワークフローのテスト実行(Test Run)結果画面。入力された「欲しいもの・金額・本当の理由」を基にLLM(gpt-4o)が稟議書を生成し、HTTPリクエストを通じてGoogle Apps Script(GAS)が正常に応答。右側のコンソールには、完成した稟議書を保存したGoogleドキュメントのURL(documentUrl)を含むJSONレスポンスが表示されており、説得資料の自動ドキュメント化が成功した様子。

【まとめ】 設定が完了したら、Difyでテスト実行してみてください! 「ブログ作業をサボってサウナに行きたいから」という身勝手な理由が、Googleドライブを開くと「AI導入により作業が効率化され、週末に妻がゆっくり休める時間と、家族で過ごす笑顔の時間が生み出されます」という、涙ぐましいほど完璧なビジネス文書に生まれ変わっています(笑)。

DifyとGASの連携によって自動生成・保存されたGoogleドキュメント形式の「家族稟議書(決裁願い)」。Dify有料プランの導入をテーマに、妻への感謝から始まり、「現状の課題」「投資対効果(メリット:妻の自由時間の増加、家計へのリターン、家族の笑顔)」「結び」までが論理的に構成され、末尾には承認・却下・条件付き承認のチェック欄と署名欄が用意された実用的な書類画面。

実は今回、GASのフォルダIDをコピペした際に「目に見えない空白(スペース)」が混ざってしまい、謎のエラーに何時間も苦しめられました。しかし、**「IDがダメなら、名前で直接探させればいい」**というプログラミング思考に切り替えたことで、圧倒的に使いやすい最強のコードが完成しました。

簡単そうに見えて毎度何かしらのエラーが出てくるのはなんでだろう

エラーと格闘して心が折れそうになることもありますが、それを乗り越えた先には「技術の無駄遣い」という最高の大人のエンターテインメントが待っています。完成した稟議書をプリントアウトし、印鑑を持って奥様の前に正座しましょう。技術的成長の証明も相まって、決裁が下りる確率は飛躍的に高まるはずです!

今回もエンタメアプリを作りましたが面白いですね。

xもやってるので是非遊びに来てください。私のエックス

次回も面白いにするか、役に立つ系にするかは未定ですが

何か作ろうと思います。是非お楽しみに!

コメント

タイトルとURLをコピーしました