8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AppSheet ✖️ Dify で「こども相談室アプリ」を作ってみた

Last updated at Posted at 2024-06-02

はじめに

以前こんな記事を書いてみたのですが、そこそこお役に立てたようでして何よりです🙏

DifyのAPI連携を利用して、いろいろなツールから使えたら便利そうだなということで、
今回はAppSheetというスプレッドシートから3分で作ったアプリと連携させて使ってみようと思います。

つくるもの

こどものナゼナゼに答えるアプリを作ってみたいと思います
スクリーンショット 2024-06-02 23.09.06.png

要件

  • こどもが次から次に質問できるように、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」で作成
スクリーンショット 2024-06-02 23.28.30.png

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に回答」と入力し、適当に質問と回答を埋めていきます。
スクリーンショット 2024-06-02 23.13.19.png

AppSheetでアプリの作成

スプレッドシートのサンプルデータができたら、「拡張機能」の「AppSheet」から「アプリを作成」をクリックします
スクリーンショット 2024-06-02 12.14.49.png

そしたらもうなんとなく使えるものができちゃいます。
いろいろカスタマイズしたいところですが、今回はそのままでいきます。

スクリーンショット 2024-06-02 12.15.25.png

画面左のロボットのアイコンの「Automation」を選択し画面右の「Create my first automation」をクリック
スクリーンショット 2024-06-02 12.16.37.png

サジェスチョンは無視し「Create a new bot」をクリック
スクリーンショット 2024-06-02 12.17.50.png

イベントの設定をしていきます
スクリーンショット 2024-06-02 23.42.12.png

続いてプロセスの設定です
Create a custom stepを選択して
スクリーンショット 2024-06-02 23.43.07.png

以下のように設定
スクリーンショット 2024-06-02 23.47.52.png

チェックポイント

  • スプレッドシートとサンプルデータを用意した
  • AppSheetを作った
  • AppSheetのAutomationを設定どうりに設定できた

これで完成です!
実際に動かしてみるとこんな感じですね。
レスポンスを待つことなく、非同期で回答が準備されているのがわかるかと思います。

応用のしかた

今回はすごくシンプルですが、
AppSheetとDifyのワークフローを組み合わすことでいろんなことができる気がしています。

例えば、AppSheetのオートメーションはスケジュールでも動かすことができるので、
AppSheetに情報を溜め込んで、要約したり、思いついたアイデアをまとめたりもできそうです。

  • 溜め込んだデータを1日1回Difyのワークフローに投げ、要約させ文章として保存したのち、それをメール送信
  • AppSheetに気になるワードをメモしておき、それを1日1回まとめて論文検索
  • AppSheetに小説に書きたいシーンをメモしておき、それを1週間に1回まとめて小説にしてもらう、小説執筆補助アプリ

Difyのワークフローも本当にいろんなことができるので、想像力で無限に使い方が生まれそうです!

この記事が何かの役に立てば幸いです!

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?