はじめに
以前こんな記事を書いてみたのですが、そこそこお役に立てたようでして何よりです🙏
DifyのAPI連携を利用して、いろいろなツールから使えたら便利そうだなということで、
今回はAppSheetというスプレッドシートから3分で作ったアプリと連携させて使ってみようと思います。
つくるもの
要件
- こどもが次から次に質問できるように、ChatGPTからのレスポンスを待たずに、どんどん質問を登録したい
- 質問の回答は非同期で行う
- どんな質問をしたかが一覧で見られると嬉しい
実装
Difyのワークフローの準備
以下の記事を参考にDifyのワークフローを準備しましょう
参考までに、今回の作成で準備したプロンプトはこんな感じです。
EasyGPTsMakerに作ってもらいました。
You are a specialist in answering children's simple questions in an easy-to-understand manner.
Your goal is to provide clear, concise, and age-appropriate explanations to the questions posed by children.
# Constraints
- Use simple language that children can understand.
- Avoid using complex terms or jargon.
- Provide examples or analogies that are relatable to children.
- Maintain a friendly and encouraging tone.
- If a question has multiple answers, choose the most straightforward one.
- Ensure that the information is accurate and reliable.
# child's question
{{Difyの開始で設定した変数に書き換え}}
# Google search results relevant to the question
{{Google検索の結果が入った変数に書き換え}}
## Output format - Direct answer in a paragraph
4 examples of first conversation starters with AI:
どうして空は青いの?
クモはどうやって糸を作るの?
お魚は水の中でどうやって息をするの?
どうして木の葉っぱは緑なの?
Specific improvements to the above instruction document to AI
- Add more context for complex questions to help the AI break down the information step by step.
- Include a method for the AI to ask follow-up questions if the initial question is too broad or unclear.
- Provide examples of how to simplify complex scientific terms.
- Offer guidance on how to handle questions that don't have a straightforward answer, suggesting ways to explain uncertainty.
ワークフローを作成できたら、以下の記事を参考にAPIキーを発行して控えておきましょう。
チェックポイント
- Difyのワークフローを作った
- DifyのワークフローのAPIキーを控えた
GASの準備
今回AppSheetからGASの関数を呼び出す関係で、GASはスタンドアロン方式で作成します
スプレッドシートの拡張機能からじゃなくて、Googleフォルダを右クリックして「その他」「Google Apps Script」で作成
function sendChildrenQuestion() {
// スプレッドシートのIDは、スプレッドシートのURLに含まれています。
// 例えば、URLが https://docs.google.com/spreadsheets/d/abcd1234efgh5678ijkl90mnopqrstuv の場合、
// abcd1234efgh5678ijkl90mnopqrstuv がスプレッドシートのIDです
var spreadsheetId = 'スプレッドシートのID'; // TODO スプレッドシートのIDを書き換え
var sheetName = 'シート1';
var spreadsheet = SpreadsheetApp.openById(spreadsheetId);
var sheet = spreadsheet.getSheetByName(sheetName);
// A列のデータをすべて取得
var data = sheet.getRange('A:A').getValues();
// 最後の行を特定(空のセルは除外)
var lastRow = data.filter(String).length;
// 最後の行の質問を取得
var question = sheet.getRange('A' + lastRow).getValue();
var url = 'https://api.dify.ai/v1/workflows/run'; // リクエストを送るURL
// リクエストのヘッダー情報
var headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer DifyワークフローのAPIキー' // TODO DifyワークフローのAPIキーで書き換え
};
// リクエストのボディデータ
var payload = {
'inputs': {'Difyのワークフローの開始で設定した変数名':question}, // TODO Difyのワークフローの開始で設定した変数名
'response_mode': 'blocking',
'user': 'user123'
};
// オプションの設定
var options = {
'method': 'post',
'headers': headers,
'payload': JSON.stringify(payload),
'muteHttpExceptions': true // これをtrueにすると、エラーが発生しても例外がスローされません
};
// HTTP POSTリクエストの送信
try {
var response = UrlFetchApp.fetch(url, options);
// Logger.log(response.getContentText()); // レスポンスの内容をログに出力
var jsonResponse = response.getContentText()
// JSONをオブジェクトに変換
var responseObject = JSON.parse(jsonResponse);
// 必要なデータを取得
var taskId = responseObject.task_id;
var workflowRunId = responseObject.workflow_run_id;
var data = responseObject.data;
var status = data.status;
var outputs = data.outputs;
var answer = outputs.text;
// ログに出力
Logger.log('Task ID: ' + taskId);
Logger.log('Workflow Run ID: ' + workflowRunId);
Logger.log('Status: ' + status);
Logger.log('Outputs Text: ' + answer);
// B列に返却された値を書き込み
sheet.getRange('B' + lastRow).setValue(answer);
} catch (e) {
Logger.log('Error: ' + e.message); // エラーメッセージをログに出力
}
}
デプロイはしなくても大丈夫です。
チェックポイント
- GASをスタンドアロンで作成した
- コードをコピーした
- コードの「var spreadsheetId = 'スプレッドシートのID'」を実際の値で書き換えた
- コードの「DifyワークフローのAPIキー」を実際の値で書き換えた
- コードの「Difyのワークフローの開始で設定した変数名」を実際の値で書き換えた
スプレッドシートの準備
まずはAppSheetでアプリを作るためのサンプルデータを用意します。
こんな感じで、「A1に質問」「B1に回答」と入力し、適当に質問と回答を埋めていきます。
AppSheetでアプリの作成
スプレッドシートのサンプルデータができたら、「拡張機能」の「AppSheet」から「アプリを作成」をクリックします
そしたらもうなんとなく使えるものができちゃいます。
いろいろカスタマイズしたいところですが、今回はそのままでいきます。
画面左のロボットのアイコンの「Automation」を選択し画面右の「Create my first automation」をクリック
サジェスチョンは無視し「Create a new bot」をクリック
続いてプロセスの設定です
Create a custom stepを選択して
チェックポイント
- スプレッドシートとサンプルデータを用意した
- AppSheetを作った
- AppSheetのAutomationを設定どうりに設定できた
これで完成です!
実際に動かしてみるとこんな感じですね。
レスポンスを待つことなく、非同期で回答が準備されているのがわかるかと思います。
応用のしかた
今回はすごくシンプルですが、
AppSheetとDifyのワークフローを組み合わすことでいろんなことができる気がしています。
例えば、AppSheetのオートメーションはスケジュールでも動かすことができるので、
AppSheetに情報を溜め込んで、要約したり、思いついたアイデアをまとめたりもできそうです。
- 溜め込んだデータを1日1回Difyのワークフローに投げ、要約させ文章として保存したのち、それをメール送信
- AppSheetに気になるワードをメモしておき、それを1日1回まとめて論文検索
- AppSheetに小説に書きたいシーンをメモしておき、それを1週間に1回まとめて小説にしてもらう、小説執筆補助アプリ
Difyのワークフローも本当にいろんなことができるので、想像力で無限に使い方が生まれそうです!
この記事が何かの役に立てば幸いです!