見出し画像

【Dify×GAS】Difyのワークフロー内でGASを呼び出してGoogleフォームを自動生成する方法

はじめに

この記事では、Difyのワークフロー内でGAS(Google Apps Script)を呼び出して新規のGoogleフォームを作成し、ChatGPTやGeminiなどのLLMブロックで生成AIで出力した質問データをフォームに自動で追加する方法について解説します。

「Googleフォーム」を自動作成&項目追加できることで、社内アンケートや顧客向けフォームなどを素早く用意することができるようになります。

エンジニアではない方でも、ポイントを押さえればすぐに連携を実行できるかと思いますので、ぜひ参考にしてください!


実際のデモ画面

実際のデモ動画です。以下の3点を実施しています。

  1. LLMブロック(ChatGPT)でフォームタイトルや説明、質問を作成

  2. データをGASに送り、Googleフォームを新規作成

  3. 2で作成したGoogleフォームに、1で作成したデータを自動で追加


\\ LINE公式にてDifyの無料相談してます //

現在Difyに関しての無料相談を行なっています!

  • Difyとスプシの連携について相談をしたい

  • イテレーションブロックや会話変数について教えてほしい

  • Difyの勉強方法について聞きたい

などなどどんな些細な悩みでも全然大丈夫ですのでお気軽にお申し込みください🙋


Difyのワークフローで新規のGoogleフォームを作成し、質問を追加する設定手順

ここからは設定手順について解説をしていきます。エンジニアの知識がなくても実装ができるようにステップバイステップで解説をしていきます!


①Googleドライブ内にフォルダを作成

まずはGoogleドライブ内にフォルダを作成してください。このフォルダの中に新規で作成したGoogleフォームが入ります。

フォルダが作成できたらフォルダIDをコピーしておきましょう。後ほど使います!

フォルダIDはGoogleドライブのフォルダの「folders/」の後ろに続く文字列(XXXXXXXXXXXXXXXXXXXXXX の部分)がフォルダIDです。

https://drive.google.com/drive/folders/XXXXXXXXXXXXXXXXXXXXXX



②Google Apps Script を作成する

Googleドライブにアクセスし、「新規」をクリックします。

「その他」から「Google App Script」を選択

エディタ画面に移動をしたら、元から書かれているコードを全て削除し、以下のGASコードを貼り付けます。

function createFormInFolder(formData) {
  // スクリプトプロパティからフォルダIDを取得
  const folderId = PropertiesService.getScriptProperties().getProperty("FOLDER_ID");
  if (!folderId) {
    throw new Error("フォルダIDがスクリプトプロパティに設定されていません。setFolderId() を先に実行してください。");
  }
  // 指定フォルダを取得
  const folder = DriveApp.getFolderById(folderId);

  // JSONデータからタイトル・説明を取得
  const title = formData.title || "Untitled Form";
  const description = formData.description || "";

  // Googleフォームを作成
  const form = FormApp.create(title).setDescription(description);

  // 質問リストを取得
  const questions = Array.isArray(formData.questions) ? formData.questions : [];

  // 質問を追加
  questions.forEach(function(q) {
    const questionText = q.question || "No question text";
    const questionType = (q.type || "TEXT").toUpperCase(); // 大文字に変換して判定しやすくする
    const choices = q.choices || [];

    switch (questionType) {
      case "TEXT":
        form.addTextItem()
          .setTitle(questionText);
        break;

      case "PARAGRAPH":
        form.addParagraphTextItem()
          .setTitle(questionText);
        break;

      case "MULTIPLE_CHOICE":
        form.addMultipleChoiceItem()
          .setTitle(questionText)
          .setChoiceValues(choices);
        break;

      case "CHECKBOX":
        form.addCheckboxItem()
          .setTitle(questionText)
          .setChoiceValues(choices);
        break;

      case "LIST":
        form.addListItem()
          .setTitle(questionText)
          .setChoiceValues(choices);
        break;

      case "LINEAR_SCALE":
        // LINEAR_SCALE(目盛り)を処理する例
        // 例として以下のプロパティを想定:
        //   q.scaleMin, q.scaleMax, q.scaleMinLabel, q.scaleMaxLabel
        // これらがない場合はデフォルト値で設定
        const scaleMin = q.scaleMin || 1;
        const scaleMax = q.scaleMax || 5;
        const scaleMinLabel = q.scaleMinLabel || "";
        const scaleMaxLabel = q.scaleMaxLabel || "";

        form.addScaleItem()
          .setTitle(questionText)
          .setBounds(scaleMin, scaleMax)
          .setLabels(scaleMinLabel, scaleMaxLabel);
        break;

      default:
        // 未定義 or 不明なtypeは TEXT扱い
        form.addTextItem()
          .setTitle(questionText);
        break;
    }
  });

  // 作成されたフォームをフォルダに移動
  const file = DriveApp.getFileById(form.getId());
  folder.addFile(file);
  // ルート(My Drive)から外したい場合はコメントアウト解除
  // DriveApp.removeFile(file);

  return form;
}



function doPost(e) {
  try {
    // POSTされたJSON文字列をパース
    const data = JSON.parse(e.postData.contents);

    // createFormInFolder 関数を呼び出してフォームを作成
    const form = createFormInFolder(data);

    // 作成したフォームの編集URLを取得
    const editUrl = form.getEditUrl();

    // JSON形式でレスポンスを返す
    const output = {
      success: true,
      editUrl: editUrl
    };
    return ContentService.createTextOutput(JSON.stringify(output))
      .setMimeType(ContentService.MimeType.JSON);

  } catch (error) {
    // エラーがあれば JSON で返す
    const output = {
      success: false,
      message: error.toString()
    };
    return ContentService.createTextOutput(JSON.stringify(output))
      .setMimeType(ContentService.MimeType.JSON);
  }
}


GASのコードを貼り付けたら保存ボタンを押してください。


③スクリプトプロパティの設定

左側にある歯車マークをクリック。

下にスクロールをしてください。

スクリプトプロパティの箇所のプロパティに対して「FOLDER_ID」と記入して値の箇所に「①Googleドライブ内にフォルダを作成」でコピーしたFOLDER_IDを貼り付けてください。


④GASのコードをデプロイする

スクリプトエディタの上部にある「デプロイ」ボタンをクリック。

新しいデプロイ」を選択。



種類の選択」の横の歯車マークをクリック。「ウェブアプリ」を選択。


次のユーザーとして実行」を「自分」に、「アクセスできるユーザー」 を 「全員」 に設定。



右下の「デプロイ」 をクリック。


次の画面で「アクセスを承認」を押し、Googleアカウントへログインします。

Advancedをクリック。

1番下の部分をクリック。

Allowをクリック。


デプロイが完了すると、デプロイIDが生成されます。この後のステップで使うのでコピーをしておきましょう!


⑤DifyでDSLファイルをインポートする

ではここまでできたらDifyの設定をしていきます。まずは下記のDSLファイルをダウンロードしてください。



Difyのホーム画面で「DSLファイルをインポート」を選択。


ファイルを選択して「作成する」を選択して、先ほどダウンロードしたファイルを選択。


以下の画面ができていたらOKです。


⑥Difyのワークフローを設定

では続いてDifyのワークフローの設定をしていきます。環境変数の設定をしていきましょう!

Difyのワークフロー画面の上部のEMVと書いてある箇所をクリック。

GAS_IDの鉛筆マークを選択し、値の箇所にステップの4でGASのデプロイしたときのIDをコピペします!

ここまで設定ができたら実際にプレビュー画面で作成したいアンケート名を設定して試してみましょう!


最後の結果にGoogleフォームのURLが出てくれば完了です。もしできない場合はもう一度説明を見直して間違っている箇所がないか探してみてください!



まとめ

この記事では、「Dify×GAS」を活用してDifyのワークフロー内で新規Googleフォームを作成し、フォームに質問を自動追加する方法について解説しました。

  • フォームを自動生成&質問を一括追加することで、アンケートや申し込みフォームの作成が一気にラクになります。

  • さらに回答結果を別のスプレッドシートに自動転記したり、回答をDify経由でSlackに通知するなど、さまざまな拡張が可能です。


記事に不明点などありましたらX(https://x.com/aius1at)もやっていますのでお気軽に質問してくださいね。

また本記事を読んで「良かった!」と思っていただけましたら「いいね」を押していただけたり、Xなどで拡散いただけますと今後のモチベーションにもつながりますのでぜひともよろしくお願いします!

ではでは〜

\\ LINE公式にてDifyの無料相談してます //

現在Difyに関しての無料相談を行なっています!

  • 今回のようなDifyとスプシの連携について相談をしたい

  • イテレーションブロックや会話変数について教えてほしい

  • Difyの勉強方法について聞きたい

などなどどんな些細な悩みでも全然大丈夫ですのでお気軽にお申し込みください🙋


関連記事



いいなと思ったら応援しよう!