カスタマインのサポートチャットをChatGTPが使えるプラグインで要約して社内に知見を貯めよう。
自己紹介
こんにちは。カスタマインアドベントカレンダーの12月8日担当のそういちろうです。
都内のゲーム会社で情報システム部門でkintoneの導入を行っています。
去年の10月に娘が生まれ10ヶ月育休を取ってました
kintoneは2021年の4月ごろから使っています。
今回はカスタマインのチャットサポートに問い合わせをした内容をメールから取得し、ChatGPTで要約、その内容をkintoneに登録をする機能を作ります。
カスタマインのチャットサポート
ユーザーサポートすごい
カスタマインのチャットサポート使ったことありますか?
カスタマインのチャットサポートはなんと人力。人が対応してくれるので、困ったときに真摯に対応してくれます
今回はそのチャットの内容をキントーンにまとめておけば知見として価値があるものにあるのでは?と思い制作に至りました
使うもの
kintone
Gmail
OpenAIのAPIkey
手順概要
Gmailからスプレッドシートにメールをフィルタリングして、シートに書き込む
取り込んだ内容をkintoneへ書き込み
取り込んだ内容をkintone上で要約
スプレッドシートの設定
シートの1行目は以下の項目にします
id
送信先
送信元
タイトル
本文
時刻
kintoneに送信したか?
以下のスクリプトを設定します。拡張機能からGoogle Apps Scriptを開いて貼り付けます。
function extractEmails() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const lastRow = sheet.getLastRow();
let lastDate = new Date(1970, 0, 1); // 初期値は非常に古い日付
let processedIds = [];
if (lastRow > 1) {
lastDate = new Date(sheet.getRange(lastRow, 6).getValue());
lastDate.setSeconds(lastDate.getSeconds() + 1); // 最後のメールの日時を1秒進める
// 既に処理されたメールIDのリストを作成
processedIds = sheet.getRange(2, 1, lastRow - 1, 1).getValues().flat();
}
//ここでメールをフィルターしています。
const query = 'from:butler@gusuku.io subject:"チャットの書き起こし" after:' + formatDate(lastDate);
const threads = GmailApp.search(query);
threads.forEach(thread => {
const messages = thread.getMessages();
messages.forEach(message => {
const messageId = message.getId();
const date = message.getDate();
// 重複チェック
if (date > lastDate && !processedIds.includes(messageId)) {
sheet.appendRow([
messageId,
message.getTo(),
message.getFrom(),
message.getSubject(),
message.getPlainBody(),
date,
]);
}
});
});
}
function formatDate(date) {
return Utilities.formatDate(date, Session.getScriptTimeZone(), "yyyy/MM/dd");
}
function sendToKintone() {
const scriptProperties = PropertiesService.getScriptProperties();
//プロパティストアに下記3点を入力して保存
const kintoneSubdomain = scriptProperties.getProperty('KINTONE_SUBDOMAIN');
const apiToken = scriptProperties.getProperty('KINTONE_API_TOKEN');
const appId = scriptProperties.getProperty('KINTONE_APP_ID');
const kintoneUrl = `https://${kintoneSubdomain}.cybozu.com/k/v1/record.json`;
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const rows = sheet.getDataRange().getValues();
rows.forEach((row, index) => {
if (index === 0) return; // ヘッダー行をスキップ
const [id, to, from, subject, body, date, flag] = row;
// 未処理の行のみ処理
if (!flag) {
const payload = {
"app": appId,
"record": {
"要約したい文章": {
"value": body
},
"問い合わせ日時": {
"value": date.toISOString()
},
"問い合わせをした人": {
"value": to
}
}
};
const options = {
"method": "post",
"headers": {
"X-Cybozu-API-Token": apiToken,
"Content-Type": "application/json"
},
"payload": JSON.stringify(payload)
};
try {
UrlFetchApp.fetch(kintoneUrl, options);
sheet.getRange(index + 1, 7).setValue(true); // 処理済みフラグを設定
} catch (e) {
console.error('Error sending to Kintone:', e);
}
}
});
}
Smart at AI for kintone Powered by GPTの設定
基本的な設定は以下を参照してください
プロンプト
今回は下記のように設定しました。変更を加えても良いでしょう。
##メール本文
%%要約したい文章%%
##出力テンプレート
■タイトル
(わかりやすいタイトルをつける)
■解決方法
(端的に解決方法をまとめる)
■内容の要約
(箇条書きでまとめる)
■参考となるリンク
リンク先が提示されていれば記入する
■検索用タグ
,で区切る。問い合わせの中で出てきたkintoneのフィールドを主に記載する。独自に設定してもよい
数値フィールド,チェックボックス,サブテーブル
kintoneの設定
要約を実行
以下のようになりました。しっかりまとめてくれていますね!
今後の課題
現状、一件ずつレコードを開いて要約を作成する必要があります。
カスタマインへの問い合わせる頻度を考えると、そこまで手間ではないのですが、一括で要約したい!という場合には、GAS側で、直接OpneAIのAPIを使って要約そしたものを登録をする。とうようにしたほうがいいかもしれません
この記事が気に入ったらサポートをしてみませんか?