kintone API

GASとGeminiでGmailのメール内容を要約して顧客リストアプリと連携してみよう!

著者名:Mamoru Fujinoki( Fuji Business Software Inc. (External link)

目次

はじめに

昨今、さまざまな業務において、ChatGPTやGeminiなど、生成AIを活用する機会が増えてきています。
たとえば、会議の内容やメール内容を生成AIを通じて情報を要約できれば、内容確認の時間短縮による業務の効率化を行うことが可能です。
今回はGoogle Apps Script(GAS)を使ってGmailのメールをGeminiで要約して定期的にkintoneアプリに登録し、顧客リストアプリと連携して顧客からの要約されたメール内容が確認できるサンプルプログラムを作成します。

完成イメージ

Gmailで受け取った顧客からのメールのメッセージ内容をGoogle Geminiを介して要約し、kintoneのメール管理アプリに登録します。

顧客リストアプリに登録されたメールアドレスの関連レコードとして要約されたメッセージ一覧が表示されます。

事前に必要なもの

開発の流れ

  • メール管理アプリの作成
  • 顧客リストアプリの作成
  • Gmailラベルの作成
  • Gemini APIキーの作成
  • Google Apps Scriptによるプログラムの作成

以上の手順で開発していきます。

メール管理アプリの作成

Step 1

kintoneのアプリ作成画面より、「はじめから作成」を選択し、以下の画像を参考にフィールドを追加します。

フィールドの種類 フィールド名 フィールドコード 備考
日時 受信日時 Received_datetime レコード登録時の日時を初期値にする
リンク 差出人 sender_email 入力値の種類:メールアドレス
文字列(1行) 件名 subject
文字列(複数行) 本文(全文) body
文字列(複数行) 本文(要約) body_summary

フォームの作成が終わったら、「フォームを保存」ボタンをクリックして変更を保存します。

Step 2

次にアプリの「設定」タブより、「APIトークン」を選択します。

「APIトークン」設定画面より、「生成する」ボタンをクリックし、「アクセス権」に「レコード追加」をチェックして「保存」します。

アプリの設定画面に戻ったら、「アプリを公開」をクリックして、設定をアプリに反映します。

以上で、「メール管理」アプリの完成です。

顧客リストアプリの作成

Step 1

kintoneアプリストアより、「アプリストア検索」に「顧客リスト」と入力してアプリを検索します。
表示された「顧客リスト」アプリから「このアプリを追加」ボタンをクリックしてインストールします。

アプリの設定画面を開き、「フォーム」タブで、画面のように「関連レコード一覧」フィールドを追加して、「フォームを保存」します。

項目 設定値
参照するアプリ メール管理
表示するレコードの条件 メールアドレス=(等しい)差出人
表示するフィールド 受信日時、件名、本文(要約)
レコードのソート 受信日時、降順

変更が終わったら、「アプリを更新」ボタンをクリックして変更をアプリに反映します。

以上で、「顧客リスト」アプリの設定は完了です。

Gmailラベルの作成

使用するGmailのアカウントにログインし、「ラベル」横の「+」サインをクリックします。

ラベル名に「処理済み」と入力し、「作成」ボタンをクリックします。

「処理済み」のラベルが作成されたことを確認します。

Gemini APIキーの作成

Google AI Studio (External link) のAPI設置画面を開きます。 「APIキーを作成」をクリックします。

「新しいキーを作成する」画面にて、APIキー名を入力し、「プロジェクトを作成」をクリックします。

「新しいプロジェクトを作成」する画面にて、プロジェクト名を入力し、「プロジェクトを作成」をクリックします。

次に「新しいキーを作成する」画面にて、「キーを作成」をクリックします。

新しいキーが作成されましたので、リンクをクリックして詳細を確認します。

APIキーの情報が表示されますので、後述する「Google Apps Scriptによるプログラムの作成」にて使用します。

Google Apps Scriptによるプログラムの作成

Step 1

Google Apps Script (External link) のサイトへ移動し、「新しいプロジェクト」をクリックします。

以下の画面が開くので、任意のプロジェクト名、ファイル名を入力します。

Step 2

プロジェクトの設定ボタンをクリックして、設定画面から「スクリプトプロパティを追加」をクリックします。

以下のプロパティを設定します。

プロパティ名
gemini_api_key {Gemini APIキーの値}
gemini_end_point {Gemini APIエンドポイントURL}
kintone_app_id {kintoneアプリID}
kintone_token {kintone APIトークン}
kintone_api_url https://{kintoneサブドメイン}.cybozu.com/k/v1/records.json

information

{Gemini APIキーの値}には、上記 「Gemini APIキーの作成」 で生成したAPIキーを入力してください。
{Gemini APIエンドポイントURL}には、Gemini APIのサービスエンドポイントのURLを指定します。
詳細は API リファレンス (External link) を参照してください。
今回は、https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContentを使用しています。

{kintoneアプリID}には、作成したkintoneメール管理アプリのIDを入力します。(次のような画面から確認できます)

{kintone APIトークン}には、上記 「メール管理kintoneアプリの作成」-「Step2」 で生成したAPIトークンを入力します。

{kintoneサブドメイン}には、お使いのkintoneのサブドメイン名を入力してください。(https://example.cybozu.com/の場合、サブドメイン名はexampleです)

Step 3

右のメニューの「エディタ」をクリックしてスクリプトエディタを開きます。

下記を参考にコーディングします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
 * Gmailのメール内容をGeminiで要約して定期的にkintoneアプリに登録するサンプルプログラム
 * Copyright (c) 2025 Cybozu
 *
 * Licensed under the MIT License
 * https://opensource.org/license/mit/
 */
const scriptProperties = PropertiesService.getScriptProperties();
const gemini_api_key = scriptProperties.getProperty('gemini_api_key'); // Gemini Api Key
const gemini_end_point = scriptProperties.getProperty('gemini_end_point');// Gemini エンドポイント
const kintone_app_id = scriptProperties.getProperty('kintone_app_id');// kintone App ID
const kintone_api_url = scriptProperties.getProperty('kintone_api_url');// kintone API リソースURL
const kintone_token = scriptProperties.getProperty('kintone_token');// kintone API トークン

const summarizeGmailMessages = () => {
  // ラベル名「処理済み」
  const label = GmailApp.getUserLabelByName('処理済み');
  // 「処理済み」ラベルのないスレッドを検索
  const threads = GmailApp.search('-label:処理済み subject:Form Record Added - CONTACT');
  const gmail_messages = [];
  for (let i = 0; i < threads.length; i++) {
    const messages = threads[i].getMessages();// スレッドのメッセージを取得
    for (let j = 0; j < messages.length; j++) {
      const gmail_message = {};
      const message = messages[j];
      gmail_message.Received_datetime = {value: message.getDate().toISOString()};// 受信日時の取得
      gmail_message.sender_email = {value: message.getReplyTo()};// 送信者のメールアドレス取得
      gmail_message.subject = {value: message.getSubject()};// メール題目の取得
      gmail_message.body = {value: message.getPlainBody()};// メッセージの取得
      gmail_message.body_summary = {value: callGemini(message.getPlainBody())};// メッセージの要約
      gmail_messages.push(gmail_message);
    }
    threads[i].addLabel(label);// スレッドに「処理済み」ラベルを設定
  }
  Logger.log('ペイロード: "%s"', JSON.stringify(gmail_messages));
  sendToKintone(gmail_messages);
};
const callGemini = (body) => {
  const payload = {
    contents: [
      {
        parts: [
          {text: body + 'を3行以内に要約してください'},
        ],
      },
    ],
  };

  const options = {
    method: 'POST',
    contentType: 'application/json',
    headers: {
      'x-goog-api-key': gemini_api_key,
    },
    payload: JSON.stringify(payload)
  };

  const response = UrlFetchApp.fetch(gemini_end_point, options);
  const data = JSON.parse(response);
  const content = data.candidates[0].content.parts[0].text;
  return content;
};

const sendToKintone = (gmail_records) => {
  // POSTリクエストを作成
  const records = {app: kintone_app_id, records: gmail_records};
  const options = {
    method: 'post',
    contentType: 'application/json',
    // JavaScriptオブジェクトをJSON文字列に変換
    payload: JSON.stringify(records),
    headers: {'X-Cybozu-API-Token': kintone_token},
  };
  // POSTリクエストを実行
  const response = UrlFetchApp.fetch(kintone_api_url, options);
  Logger.log('POSTリクエストのレスポンス: "%s"', response.getContentText());
};

コーディング終了後、保存します。

解説
スクリプトパラメーターの値の取得

以下のAPI関数で、各スクリプトパラメーターの値を取得します。

PropertiesService.getScriptProperties()

1
2
3
4
5
6
const scriptProperties = PropertiesService.getScriptProperties();
const gemini_api_key = scriptProperties.getProperty('gemini_api_key'); // Gemini Api Key
const gemini_end_point = scriptProperties.getProperty('gemini_end_point');// Gemini エンドポイント
const kintone_app_id = scriptProperties.getProperty('kintone_app_id');// kintone App ID
const kintone_api_url = scriptProperties.getProperty('kintone_api_url');// kintone API リソースURL
const kintone_token = scriptProperties.getProperty('kintone_token');// kintone API トークン
Gmailメッセージの取得

Gmailに届いた「処理済み」ラベルのないスレッドを検索、取得します。

以下のAPI関数で、「処理済み」のラベル名を取得します。

GmailApp.getUserLabelByName('処理済み')

1
2
// ラベル名「処理済み」
const label = GmailApp.getUserLabelByName('処理済み');

以下のAPI関数で、「処理済み」でない(-label:{ラベル名})、件名に「Form Record Added - CONTACT」(subject:{件名のテキスト})が含まれるメッセージのスレッドを検索します。

注:subject:{件名のテキスト}を指定しない場合、「処理済み」ラベルのないすべてのメッセージが検索結果の対象になります。未読のメッセージのみを対象にしたい場合には、is:unreadを追加設定してください。

GmailApp.search('-label:処理済み subject:Form Record Added - CONTACT')

1
2
// 「処理済み」ラベルのないスレッドを検索
const threads = GmailApp.search('-label:処理済み subject:Form Record Added - CONTACT');

検索結果より、Gmailの各スレッドのメッセージの内容を所得し、kintoneメール管理アプリのリクエストデータ形式に各値を設定します。 kintoneへ送信するリクエストデータのJSON形式の詳細は 複数のレコードを登録する を参照してください。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
const gmail_messages = [];
for (let i = 0; i < threads.length; i++) {
  const messages = threads[i].getMessages();// スレッドのメッセージを取得
  for (let j = 0; j < messages.length; j++) {
    const gmail_message = {};
    const message = messages[j];
    gmail_message.Received_datetime = {value: message.getDate().toISOString()};// 受信日時の取得
    gmail_message.sender_email = {value: message.getReplyTo()};// 送信者のメールアドレス取得
    gmail_message.subject = {value: message.getSubject()};// メール題目の取得
    gmail_message.body = {value: message.getPlainBody()};// メッセージの取得
    gmail_message.body_summary = {value: callGemini(message.getPlainBody())};// メッセージの要約
    gmail_messages.push(gmail_message);
  }
  threads[i].addLabel(label);// スレッドに「処理済み」ラベルを設定
}

また、以下のAPI関数で「処理済み」のラベルをスレッドに設定します。

threads[i].addLabel(label)

1
threads[i].addLabel(label);// スレッドに「処理済み」ラベルを設定
Geminiでメッセージを要約

以下のデータ形式でリクエストのデータを設定します。上記で取得したメッセージの内容を「3行以内に要約」するように指示しています。

1
2
3
4
5
6
7
8
9
const payload = {
  contents: [
    {
      parts: [
        {text: body + 'を3行以内に要約してください'},
      ],
    },
  ],
};

以下のようにヘッダーに上記で取得したGoogle APIキーを設定します。
また、APIリクエストの送信データを「payload」キーの値として設定します。

1
2
3
4
5
6
7
8
const options = {
  method: 'POST',
  contentType: 'application/json',
  headers: {
    'x-goog-api-key': gemini_api_key,
  },
  payload: JSON.stringify(payload)
};

以下の関数で、Gemini APIにリクエストを送信します。

const response = UrlFetchApp.fetch(gemini_end_point, options);

1
2
3
const response = UrlFetchApp.fetch(gemini_end_point, options);
const data = JSON.parse(response);
const content = data.candidates[0].content.parts[0].text;

Gemini APIの関数の詳細については、 「Gemini API ドキュメント」-「テキスト生成」 (External link) を参照してください。

kintoneへデータを送信

上記で作成したkintoneアプリの情報を設定します。

1
2
3
4
5
6
7
8
9
// POSTリクエストを作成
const records = {app: kintone_app_id, records: gmail_records};
const options = {
  method: 'post',
  contentType: 'application/json',
  // JavaScriptオブジェクトをJSON文字列に変換
  payload: JSON.stringify(records),
  headers: {'X-Cybozu-API-Token': kintone_token},
};

次のAPI関数でkintoneへデータを送信します。

UrlFetchApp.fetch(subdomain, options);

1
const response = UrlFetchApp.fetch(kintone_api_url, options);

次の形式でレスポンスが返ってくれば成功です。

{"ids":["レコードID"],"revisions":["リビジョン番号"]}

80
Logger.log('POSTリクエストのレスポンス: "%s"', response.getContentText());

Step 4

トリガーの設定画面を表示し、[トリガーを追加]からトリガーを追加します。

イベント発生時に実行する関数には上記で作成したGAS関数、イベントのソースには「時間主導型」、時間ベースのトリガーのタイプには「分ベースのタイマー」、時間の間隔には「10分おき」を設定し、保存します。

以上でGoogle Apps Scriptの設定は完了です。

動作確認

Apps Scriptの編集画面より、「実行する関数」に「summarizeGmailMessages」を選択し、「実行」ボタンをクリックします。

実行後、Gmailのメッセージレコードがkintoneに登録されているか確認します。

また、10分おきにプログラムが実行されているか「実行数」で確認できます。

また、上記で作成した「顧客リスト」アプリにメールアドレスで連携したメッセージ情報が表示されているか確認します。
関連レコード一覧に顧客のメールアドレス宛のメッセージが表示されていれば動作確認完了です。

まとめ

Google Apps ScriptでGemini APIを呼び出し、メール内容を要約してkintoneアプリに登録すれば、顧客から受け取ったメール履歴の内容を簡単にチェックできます。
また、今回利用したテキストの要約以外にも「画像」、「動画」、「ドキュメント」、「音声」などを処理できるモデルも用意されていますので、用途に応じて応用してみてください。

参照サイト

information

このTipsは、2025年12月版kintoneで動作を確認しています。