
こちらの記事は2025年4月16日noteに投稿した内容です。
Difyでチャットフローを構築した場合、チャット履歴は下図のように「ログ&アナウンス」メニューで確認できます。しかし、この画面ではリストから該当のチャットを選択し、その内容をひとつずつチャット画面で確認する必要があります。特にカスタマーサポート用のチャットボットなど、ユーザーからの問い合わせ内容とLLMの回答を一覧で確認したい場合には不便です。一覧形式であれば、問い合わせに対する回答が的確かどうかを一目で確認できるからです。

今回は、Difyのチャットフローでのチャット履歴をGoogle Sheetに自動で記録する実装方法について解説します。
1.Difyでチャットフローを作成する

まずはDifyでチャットフローを作成します。図では簡易プロンプトインジェクション対策の「質問分離器」ブロックやナレッジデータを参照する「知識取得」ブロックが入っていますが、「開始」→「LLM」→「回答」のシンプルなフローでも構いません。
2.Dify APIキーの取得
チャットフローが完成したらDifyのAPIキーを取得します。左側メニューからAPIアクセスを選択し、右上鍵アイコンのAPIキーをクリックします。

APIシークレットキーウィンドウで、+新しいシークレットキーを作成をクリックします。

app-で始まるAPIシークレットキー(以下APIキー)が表示されますのでコピーしてメモ帳などに貼り付けて控えておいてください。

3.Google Sheetの作成
DifyのAPIキーを取得したら次にGoogle Sheetを作成します。空のスプレッドシートを任意の場所に作成してください。
1行目のA列からC列にタイトルを以下のように入力します。
A列:timestamp、B列:question、C列:answer
A列に処理日時、B列にユーザーからの問い合わせ内容、C列にLLMの回答が記録されます。ファイル名、シート名は任意で結構です。

4.Google Apps Scriptの作成
Google Sheetの準備が出来ましたら、拡張機能メニューからApps Scriptを選択してGoogle Apps Script(GAS)を作成します。以下のコードをそのまま貼り付けて右上のデプロイボタンを押してください。

function doPost(e) {
// 生データを取得
var rawData = e.postData.contents || "";
Logger.log("Raw data received: " + rawData); // デバッグ用ログ
var data;
try {
// JSONパースを試行
data = JSON.parse(rawData);
} catch (error) {
// JSONパースエラー時の対応
Logger.log("JSON parse error: " + error.message); // デバッグログ
return ContentService.createTextOutput(
JSON.stringify({
status: "error",
message: "Invalid JSON format",
error: error.message
})
).setMimeType(ContentService.MimeType.JSON);
}
// データの抽出
var question = data.question || "No question";
var answer = data.answer || "No answer";
// スプレッドシートにデータを記録
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var timestamp = new Date();
sheet.appendRow([timestamp, question, answer]);
// 成功レスポンスを返す
return ContentService.createTextOutput(
JSON.stringify({ status: "success" })
).setMimeType(ContentService.MimeType.JSON);
}
5.GASのデプロイ
種類の選択ではウェブアプリを選択します。説明は任意の説明文を入力します。ウェブアプリ欄の次のユーザーとして実行は自分、アクセスできるユーザーは全員にしてデプロイボタンを押します。

画面が推移しますので、アクセスを承認をクリックします。

画面が推移しますので自分のアカウントを選択します。

警告画面が出ますが左下のAdvancedを選択して進めます。

左下のGo to {Apps Script名}(unsafe)を選択して進めます。

画面が推移しますので、右下のAllowを選択してGoogleアカウントにアクセス許可をします。この際Googleアクティビティにも通知が来ますので承認してください。

デプロイが更新されウェブアプリのURLが発行されますので、コピーしてメモ帳などに控えておいてください。

6.GASプロジェクトの設定
GASのデプロイが完了しましたら、次にGASのプロジェクトの設定をします。Apps Script歯車アイコンのプロジェクトの設定を選択してください。
下部スクリプトプロパティ欄に
プロパティ:api_key
値:DifyのAPIキー
を入力します。

7.Dify HTTPリクエストブロックの追加と設定
GASのプロジェクト設定まで終わりましたらDifyのチャットフローにHTTPリクエストブロックを回答ブロックの後に追加します。

HTTPブロックの設定は以下のようにします。
APIはPOSTを選択し、値にはGASのウェブアプリURLを入力します。
ヘッダーは以下のように入力します。
キー:Content-Type
値:application/text
パラメータは以下のように入力します。
キー:api_key
値:Dify APIキー
ボディはJSONを選択し、値は以下の通り入力します。
タイムアウト設定以下は初期値で結構です。
{
"question":"{{#sys.query#}}",
"answer":"{{#llm.text#}}"
}

8.動作テスト
プレビュー画面で動作テストを行います。エラーが出ることなくGoogle Sheetに内容が記録されたら成功です。


9.LLMの回答に定型文や質問のサジェスチョンを入れる場合
LLMの回答に定型文や質問のサジェスチョンなどを追加で出力する場合は、本来の回答とそれ以外の情報を切り分けて本来の回答のみGoogle Sheetに記録するように修正します。今回は以下のようにLLMの回答にボタン形式で質問のサジェスチョンを追加する場合を例に解説します。

10.コード(コード実行)ブロックの追加と設定
回答ブロックとHTTPリクエストブロックの間にコードブロックを追加します。

コードブロックは以下のように設定します。
入力変数に初期値ではarg1とarg2が入力されていますが、arg2を削除し、arg1をdataに変更します。値はLLM/textStringを選択します。
PYTHON3に以下のコードを入力します。
def main(data: str) -> dict:
extracted_data = data.split('\n\n')[0]
return {'result': extracted_data}
出力変数は、resultとしてStringを選択します。
11.HTTPリクエストブロックの修正
HTTPリクエストブロックのJSON部分を修正します。answerの値をLLM出力からコード出力に修正します。

12.動作テスト
プレビュー画面で動作テストを行います。エラーが出ることなくGoogle Sheetに内容が記録されたら成功です。


まとめ
今回は、Difyのチャット履歴をGoogle Sheetsに自動で記録する方法を解説しました。この仕組みにより、チャットの内容を一覧形式で確認できるだけでなく、応答の質や傾向を分析することも容易になります。特にカスタマーサポートやユーザー調査など、会話内容の分析が重要なケースでは大変有効です。また、Google Sheetsの検索機能やフィルタリング機能を活用すれば、特定のキーワードを含む会話の抽出も簡単に行えます。今回の実装は基本的な記録機能のみですが、応用次第でより高度な分析やレポート作成も可能になると思います。是非お試しください。