見出し画像

【Dify×GAS】Difyのワークフロー内でGASを呼び出して新規のスプレッドシートを作成し、表データを記入する方法

はじめに

この記事では、Difyのワークフロー内でGASを呼び出して新規のスプレッドシートを作成し、ChatGPTやGeminiなどの生成AIで出力した表データを記入する方法について解説します。

実際のデモ画面

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

  1. Geminiで指定したキーワードに対しての表データを作成

  2. スプレッドシートの新規作成

  3. 2で作成したスプレッドシートに表データを記入


\\ LINE公式アカウントにてDifyの無料相談してます //

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

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

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

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

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


Difyのワークフローで新規のスプレッドシートを作成し、表データを記入する設定手順

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


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

まずはGoogleドライブ内にフォルダを作成してください。このフォルダの中に新規のスプレッドシートが入ります。

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

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

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



②Google Apps Script を作成する

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

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

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

function doPost(e) {
  try {
    // POSTで送信されたデータをパース (JSON形式)
    const data = JSON.parse(e.postData.contents);

    // メソッドによる処理の振り分け
    switch (data.method) {
      // スプレッドシート作成処理
      case 'createSpreadsheet':
        if (data.folderId) {
          const result = createSpreadsheetInFolder(data.folderId);
          return ContentService.createTextOutput(JSON.stringify(result))
                               .setMimeType(ContentService.MimeType.JSON);
        } else {
          return ContentService.createTextOutput(JSON.stringify({error: "Folder ID is missing."}))
                               .setMimeType(ContentService.MimeType.JSON);
        }

      // スプレッドシートにデータを記入する処理
      case 'setSpreadsheetValue':
        if (data.spreadsheetId && data.range && data.setValue) {
          const result = setSpreadsheetValue(data.spreadsheetId, data.range, data.setValue);
          return ContentService.createTextOutput(JSON.stringify(result))
                               .setMimeType(ContentService.MimeType.JSON);
        } else {
          return ContentService.createTextOutput(JSON.stringify({error: "Missing required parameters for setting spreadsheet value."}))
                               .setMimeType(ContentService.MimeType.JSON);
        }

      // 表形式のデータをスプレッドシートに挿入する処理
      case 'spreadsheetFillInTable':
        if (data.spreadsheetId && data.title && data.sheetName && data.tableHeader && data.tableData) {
          const result = spreadsheetFillInTable(data.spreadsheetId, data.title, data.sheetName, data.tableHeader, data.tableData);
          return ContentService.createTextOutput(JSON.stringify(result))
                               .setMimeType(ContentService.MimeType.JSON);
        } else {
          return ContentService.createTextOutput(JSON.stringify({error: "Missing required parameters for spreadsheetFillInTable."}))
                               .setMimeType(ContentService.MimeType.JSON);
        }

      // 未知のメソッドに対するエラーハンドリング
      default:
        return ContentService.createTextOutput(JSON.stringify({error: "Unknown method."}))
                             .setMimeType(ContentService.MimeType.JSON);
    }
  } catch (error) {
    // エラーハンドリング
    return ContentService.createTextOutput(JSON.stringify({error: error.toString()}))
                         .setMimeType(ContentService.MimeType.JSON);
  }
}


/**
 * 指定されたフォルダに新しいスプレッドシートを作成し、そのIDとURLを返す
 * @param {string} folderId - GoogleドライブのフォルダID
 * @return {Object} - 作成したスプレッドシートのIDとURLを含むオブジェクト
 */
function createSpreadsheetInFolder(folderId) {
  try {
    // フォルダの取得
    const folder = DriveApp.getFolderById(folderId);

    // 新しいスプレッドシートの作成
    const newSpreadsheet = SpreadsheetApp.create("New Spreadsheet");

    // スプレッドシートを指定フォルダに移動
    const file = DriveApp.getFileById(newSpreadsheet.getId());
    folder.addFile(file);
    DriveApp.getRootFolder().removeFile(file);  // 元のフォルダから削除

    // 作成したスプレッドシートのIDとURLを返す
    return {
      success: true,
      message: "スプレッドシートの作成が完了しました。",
      spreadsheetId: newSpreadsheet.getId(),
      spreadsheetUrl: newSpreadsheet.getUrl()
    };

  } catch (error) {
    // エラーハンドリング
    return { 
      success: false, // 失敗したことを示す
      message: "スプレッドシートの作成に失敗しました。", // 失敗時の概要
      error: error.toString() 
      };
  }
}

/**
 * スプレッドシートに指定された範囲に値を記入する
 * @param {string} spreadsheetId - スプレッドシートのID
 * @param {string} range - 記入するセル範囲(例: "A1")
 * @param {any} value - セルに記入する値
 * @return {Object} - 記入が成功したかどうかの結果
 */
function setSpreadsheetValue(spreadsheetId, range, value) {
  try {
    // スプレッドシートの取得
    const spreadsheet = SpreadsheetApp.openById(spreadsheetId);

    // 指定された範囲に値をセット
    const sheet = spreadsheet.getActiveSheet();
    sheet.getRange(range).setValue(value);

    // 成功メッセージを返す
    return { success: true, message: "Value set successfully." };
  } catch (error) {
    // エラーハンドリング
    return { error: error.toString() };
  }
}

/**
 * スプレッドシートに表形式のデータを挿入する
 * @param {string} spreadsheetId - スプレッドシートのID
 * @param {string} title - スプレッドシートのタイトル
 * @param {string} sheetName - 挿入するシートの名前
 * @param {Array} tableHeader - 表のヘッダー (1次元配列)
 * @param {Array} tableData - 表のデータ (2次元配列)
 * @return {Object} - メッセージとスプレッドシートのURL
 */
function spreadsheetFillInTable(spreadsheetId, title, sheetName, tableHeader, tableData) {
  try {
    // スプレッドシートにアクセス
    const spreadsheet = SpreadsheetApp.openById(spreadsheetId);

    // スプレッドシートのタイトルを設定
    spreadsheet.setName(title);

    // 1番目のシートを取得し、名前を設定
    const sheet = spreadsheet.getSheets()[0];
    sheet.setName(sheetName);

    // ヘッダーを1行目に挿入し、セルの色を薄い青色に設定
    sheet.getRange(1, 1, 1, tableHeader.length).setValues([tableHeader]).setBackground('#D9EAD3');

    // データを2行目以降に挿入
    sheet.getRange(2, 1, tableData.length, tableHeader.length).setValues(tableData);

    // データが入っている列の幅を200ピクセルに統一する
    for (let i = 1; i <= tableHeader.length; i++) {
      sheet.setColumnWidth(i, 200);  // 各列を200ピクセルに設定
    }

    // セル内のテキストを折り返し表示する設定
    sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).setWrap(true);



    // スプレッドシートのURLを取得
    const spreadsheetUrl = spreadsheet.getUrl();

    // 成功メッセージとURLを返す
    return {
      success: true,
      message: "Table has been inserted successfully.",
      spreadsheetUrl: spreadsheetUrl
    };

  } catch (error) {
    // エラーハンドリング
    return { error: error.toString() };
  }
}


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

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

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



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


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



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


次の画面で「アクセスを承認」を押し、Googleアカウントへログインします。デプロイが完了すると、IDが生成されます。この後のステップで使うのでコピーをしておきましょう!


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

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



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


ファイルを選択して「作成する」を選択


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


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

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


環境変数には

  • 作成したスプレッドシートの保存場所に指定したいGoogleドライブのID

  • GASのデプロイしたときのID

上記2点を設定いきます!


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


まずはGoogleドライブのIDから設定していきましょう!下記をクリック。

値にドライブIDの記入と保存をクリック。これでGoogleドライブのIDの設定は完了です。


同じようにGASのIDも設定していきます!

ここまで設定ができたら実際に実行画面で試してみてください。最後の結果にスプレッドシートのURLが出てくれば完了です。もしできない場合はもう一度説明を見直して間違っている箇所がないか探してみてください!


まとめ

この記事では、「Dify×GAS」を使ってDifyのワークフロー内で新規スプレッドシートを作成して表形式のデータを記入する方法について説明しました。

今回は簡単な機能の実装でしたが、この機能を応用すれば様々な業務の効率化をすることができるかと思いますのでぜひ実行をしてみてください。


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

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

ではでは〜

\\ LINE公式アカウントにてDifyの無料相談してます //

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

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

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

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

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


関連記事


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