見出し画像

カスタマインのサポートチャットをChatGTPが使えるプラグインで要約して社内に知見を貯めよう。


自己紹介

こんにちは。カスタマインアドベントカレンダーの12月8日担当のそういちろうです。
都内のゲーム会社で情報システム部門でkintoneの導入を行っています。
去年の10月に娘が生まれ10ヶ月育休を取ってました
kintoneは2021年の4月ごろから使っています。
今回はカスタマインのチャットサポートに問い合わせをした内容をメールから取得し、ChatGPTで要約、その内容をkintoneに登録をする機能を作ります。

カスタマインのチャットサポート


ユーザーサポートすごい
カスタマインのチャットサポート使ったことありますか?
カスタマインのチャットサポートはなんと人力。人が対応してくれるので、困ったときに真摯に対応してくれます
今回はそのチャットの内容をキントーンにまとめておけば知見として価値があるものにあるのでは?と思い制作に至りました

使うもの

手順概要

Gmailからスプレッドシートにメールをフィルタリングして、シートに書き込む
取り込んだ内容をkintoneへ書き込み
取り込んだ内容をkintone上で要約

スプレッドシートの設定

シートの1行目は以下の項目にします

  1. id

  2. 送信先

  3. 送信元

  4. タイトル

  5. 本文

  6. 時刻

  7. 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を使って要約そしたものを登録をする。とうようにしたほうがいいかもしれません

この記事が気に入ったらサポートをしてみませんか?