😽

DifyとGoogle Sheetを連携して、誰でも使える化を試してみる

2024/08/14に公開

はじめに

Difyを活用すれば、生成AIを利用したチャットボットやワークフローの構築が非常に簡単に行えます。これらのワークフローは、さまざまな業務に柔軟に適用できるため、業務効率の向上が期待できます。最近、Difyを利用する機会が増えている中で、特にGoogle Sheetとの連携が業務効率化に大いに役立つと感じています。そこで、実際にGoogle SheetとDifyを連携させて、「誰でも簡単に、Difyを使ってGoogle Sheetの業務の効率化」ができるように検証してみたいと思います。

前提とする業務

  • サンプルとして、GoogleSheetに記載されているアンケートデータの要約や翻訳を行うことをゴールにしたいと思います。

ダミーデータを作る

GPTに以下のようなお願いをして、ダミーデータを作ってもらいました。

Googleシートを使ってアンケートのサンプルデータを作成します。 あなたのタスクは、 回答者の属性と回答内容が記載されているダミーデータを10件作ることです。 アンケートの回答には400文字程度の長めの文章を入れるようにしてください。Googleシートにそのままクリップできるように、コードブロックで出力して区切り文字はセミコロンでお願いします。

ちなみにChatGPTのMacアプリではかなり文字起こしの精度が高く利用できます。上記の指示は音声で入力しましたが、いい感じに出力されました。

作成されたデータは以下です。

回答者;性別;年齢;職業;回答内容
1;男性;25;会社員;私が日常的に使っているアプリについてですが、最近のアップデートで大きく使い勝手が向上しました。特に新しいインターフェースは直感的で、初心者でも簡単に操作できるようになっています。また、機能面でも新たに追加された項目が非常に便利で、作業効率が大幅にアップしました。ただし、少し動作が重くなったように感じるため、今後の改善が期待されます。それでも、全体的には非常に満足しています。
2;女性;30;教師;教育現場において、最新のテクノロジーがどのように役立つかについて考える機会が増えました。特に、オンライン教材の充実は学生の自主学習を大いに支援しています。ただし、全ての生徒がインターネットにアクセスできるわけではないため、デジタル格差の問題は依然として存在します。この問題を解決するためには、政府や教育機関が協力して環境整備を進めることが必要です。
3;男性;35;フリーランス;私が現在関心を持っているのは、働き方改革の一環としてのリモートワークの導入です。リモートワークは通勤時間の削減や働きやすさの向上に繋がる一方で、仕事とプライベートの境界が曖昧になるという課題もあります。特に、自己管理が重要であり、集中力を維持するための工夫が求められます。この点については、個々人の適性や環境によって異なるため、一律の対応は難しいと感じています。
4;女性;28;看護師;コロナ禍での医療現場の現状について話したいと思います。現在、病院は常に満床で、スタッフも疲労が溜まっており、非常に厳しい状況が続いています。しかし、その一方で、患者さんからの感謝の言葉や、回復していく姿を見ると、仕事のやりがいを感じます。医療従事者としての責任感を持って、日々の業務に取り組んでいますが、今後はさらにサポートが必要だと感じています。
5;男性;40;公務員;地域社会における防災対策の重要性について再認識しています。特に、災害時における迅速な避難誘導や、避難所の設営準備が整っているかどうかは、住民の命を守るために欠かせない要素です。防災訓練や普段からの情報共有を通じて、地域全体での意識向上を図ることが必要です。これからも、より良い防災対策を目指して、日々努力を続けていきたいと思います。
6;女性;32;主婦;最近、子育てに関する情報を集めるためにインターネットをよく活用していますが、情報が多すぎてどれが正しいのか判断に迷うことがよくあります。特に、育児方法や教育方針に関する情報は、専門家の意見や他の親の体験談が混在しており、何を信じて実践するべきか悩んでいます。結局は、自分の子どもに合った方法を見つけることが大切だと感じています。
7;男性;29;ITエンジニア;私は日々新しいプログラミング言語や技術を学んでいますが、テクノロジーの進化のスピードには驚かされます。特に、AIや機械学習の分野は日々新しい発見があり、常に最新の知識を習得する必要があります。しかし、どれだけ技術が進歩しても、最終的にはそれをどのように活用するかが重要だと考えています。技術の裏にある倫理や社会的影響も忘れてはなりません。
8;女性;26;デザイナー;デザインの仕事を通じて感じるのは、常に新しいインスピレーションを求め続けることの難しさです。クライアントの要望に応えるためには、時代のトレンドを把握しつつも、独自の視点を持つことが求められます。特に、インターネット上には無数のデザインが存在しており、それらに影響されないオリジナリティを保つことが非常に重要です。
9;男性;31;研究者;研究活動を続ける中で、論文執筆の際に直面する課題は多岐にわたります。特に、実験結果をどう解釈するか、そしてそれをどう伝えるかは非常に重要です。正確なデータ分析が求められる一方で、読者にわかりやすく説明するためには、専門用語を使いすぎないように心掛ける必要があります。また、論文を通じて新しい知見を提供することが研究者の使命であると考えています。
10;女性;34;マーケティング;現在のマーケティング戦略において、SNSの活用が不可欠となっています。特に、ターゲット層に応じたコンテンツの作成や、エンゲージメントを高めるためのコミュニケーションが求められます。ただし、SNS上でのマーケティングは一歩間違えると炎上リスクもあり、慎重な対応が必要です。常にユーザーの視点に立ち、共感を呼ぶメッセージを発信することが成功の鍵だと感じています。

貼り付けると以下のようになります。

Difyでワークフローを構築する

今回はサンプルとして簡単なワークフローを構築しました。シンプルに「開始」のブロックで入力を受け取って、「LLM」のブロックで要約タスクを行います。「終了」ブロックで最終的な出力が得られる仕様になっています。

開始ブロックの設定

開始ブロックの入力フィールドは、以下のように設定しました。変数名を base_data と設定しているため、APIとして利用する場合はこの変数名を指定して文章を渡す必要があります。この点については、後半の実装例にて記載します。

LLMブロックの設定

今回は動作検証が目的であったため、モデルやプロンプトは簡易的な内容になっています。

モデルは初期値の gpt-3.5-turbo を指定しています。 コンテキストとして、「開始ブロックの出力」(ユーザーが入力したbase_data)を与えています。プロンプトにコンテキストと「上記のデータを30文字に要約して」という指示を指定しています。

終了ブロックの設定

終了ブロックには、出力変数として、「LLMブロック」のtextをデータとして指定しています。APIとして利用する際には、この内容がユーザーに返却されるレスポンスになります。

上記の手順でサンプルのワークフローが構築されました。このワークフローをAPIとして利用をしてみたいと思います。

GASを利用して、DifyのAPIと連携する

記事の冒頭にて紹介したスプレッドシートのE列に記載のある内容を、要約してF列に記載するような仕様で作成を行います。

完成したGASのコードは以下のようになります。

GASのソースコード全文

function sendColumnEDataToWorkflowAPI() {
  // スプレッドシートを取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  
  // E列のデータを取得(データがある範囲のみ)
  var columnEValues = sheet.getRange(2, 5, sheet.getLastRow() - 1).getValues();
  
  // APIエンドポイントURL
  var apiUrl = "https://api.dify.ai/v1/workflows/run";
  
  // 提供されたAPIキー
  var apiKey = "your-api-key";
  
  // 各データをAPIに送信し、F列に結果を書き出す
  for (var i = 0; i < columnEValues.length; i++) {
    var data = {
      "inputs": {
        "base_data": columnEValues[i][0]  // 送信するテキストデータ
      },
      "response_mode": "blocking",  
      "user": "user_" + (i + 1)  
    };
    
    var options = {
      "method" : "post",
      "contentType": "application/json",
      "headers": {
        "Authorization": "Bearer " + apiKey
      },
      "payload" : JSON.stringify(data)
    };
    
    try {
      var response = UrlFetchApp.fetch(apiUrl, options);
      var responseText = response.getContentText();
      var jsonResponse = JSON.parse(responseText);
      
      // デコードしたテキストを取得
      var decodedText = Utilities.newBlob(jsonResponse.data.outputs.text).getDataAsString();
      
      // F列にデコードしたテキストを書き出す
      sheet.getRange(i + 2, 6).setValue(decodedText);  
      
    } catch (e) {
      Logger.log("Error for row " + (i + 2) + ": " + e.toString());
      // エラーが発生した場合、F列にエラーメッセージを記載
      sheet.getRange(i + 2, 6).setValue("Error: " + e.toString());
    }
  }
}

簡単な解説

  • apiKeyは、Dify上で発行するAPI_Keyを指定してください
  • decodedText として、テキストのデコードを行っていますがこれはログ出力時の文字化け対策のものです。不要であれば、適宜修正してください。
  • inputs として、base_data の値にE列のデータを与えています。このKeyの名前(base_data )がDifyの設定と一致していないと利用した際にエラーが発生するため、留意が必要です。

誰でも使えるようにGASの汎用性を高める

ここからが本題です。

上記のコードでも問題なく、動作自体は問題なく利用可能です。ただ、参照元の列や出力列が固定になってしまっているため、汎用性が低い状態になっています。

Difyを社内で利用する場合などにおいては、利用者の方によってITスキルに差があることが想定されるため、より汎用的に利用ができるようにソースコードを修正したいと思います。

具体的には、処理を行う対象のシートとは別に設定シートをGoogle Sheetに作成して、レイアウトが変わってもソースコードへの編集を行わずに利用ができるようにしたいと思います。

以下のように、設定を行うためのシートを作成しました。

上記のデータを参照して処理を行います。このように設定情報をスプレッドシートに記載して、処理を行いたい対象の列情報とプロンプトを指定可能とすることで、より簡単に利用が可能です。

動作イメージは以下のようになります。

動作イメージの動画

https://youtu.be/UZmu_AWLiDI

GASのソースコードは以下となります。常に1つ目のシートを参照して、処理を行い設定情報は「設定」シートを参照するようにしています。

設定を読み込む場合のGASのソースコード全文

function sendColumnDataToWorkflowAPI() {
  // 設定シートの参照
  var settingsSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("設定");
  var inputColumnLetter = settingsSheet.getRange("A2").getValue();  // インプット列
  var outputColumnLetter = settingsSheet.getRange("B2").getValue();  // アウトプット列
  var prompt = settingsSheet.getRange("C2").getValue();  // プロンプト
  
  // インプット列とアウトプット列のインデックス取得
  var inputColumnIndex = columnLetterToIndex(inputColumnLetter);
  var outputColumnIndex = columnLetterToIndex(outputColumnLetter);
  
  // 常に1つ目のシート(最初のシート)を参照
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
  
  // インプット列のデータを取得(データがある範囲のみ)
  var columnValues = sheet.getRange(2, inputColumnIndex, sheet.getLastRow() - 1).getValues();
  
  // APIエンドポイントURL
  var apiUrl = "https://api.dify.ai/v1/workflows/run";
  var apiKey = "your-api-key";
  
  
  
  // 各データをAPIに送信し、アウトプット列に結果を書き出す
  for (var i = 0; i < columnValues.length; i++) {
    var data = {
      "inputs": {
        "base_data": columnValues[i][0], 
        "prompt" : prompt
      },
      "response_mode": "blocking",  
      "user": "user_" + (i + 1)  
    };
    
    var options = {
      "method" : "post",
      "contentType": "application/json",
      "headers": {
        "Authorization": "Bearer " + apiKey
      },
      "payload" : JSON.stringify(data)
    };
    
    try {

      
      var response = UrlFetchApp.fetch(apiUrl, options);
      var responseText = response.getContentText();
      var jsonResponse = JSON.parse(responseText);
      
      // デコードしたテキストを取得
      var decodedText = Utilities.newBlob(jsonResponse.data.outputs.text).getDataAsString();
      
      // アウトプット列にデコードしたテキストを書き出す
      sheet.getRange(i + 2, outputColumnIndex).setValue(decodedText);
      SpreadsheetApp.flush()
      
    } catch (e) {
      Logger.log("Error for row " + (i + 2) + ": " + e.toString());
      // エラーが発生した場合、アウトプット列にエラーメッセージを記載
      sheet.getRange(i + 2, outputColumnIndex).setValue("Error: " + e.toString());
    }
  }
}

// 列のアルファベットを列インデックスに変換する関数
function columnLetterToIndex(letter) {
  return letter.charCodeAt(0) - 'A'.charCodeAt(0) + 1;
}

上記のように実装することで、GASのエディター画面で入力として利用する列の指定や、出力列の指定、プロンプトの内容を変更する必要はなくなり、Google Sheet上で管理ができるようになります。
普段からコーディングに慣れていない方でも、比較的簡単に利用ができるようになるのではないでしょうか。

まとめ

今回の記事では、DifyとGoogle Sheetを連携して業務効率化を図る方法を紹介しました。Difyを活用することで、生成AIを利用したチャットボットやワークフローの構築が簡単に行え、業務の効率化が期待できます。特に、Google Sheetとの連携により、さまざまなデータ処理や自動化が可能になり、実際にアンケートデータを要約するワークフローを構築して、その効果を確認しました。
DifyとGoogle Sheetを連携させた業務効率化を行う際に、この方法を応用すれば、他の業務にも簡単に適用できるのではないかと感じています。是非、試してみてください!

Discussion