MiiTel Meetings / MiiTel RecPod の会議履歴を Google スプレッドシートに蓄積し、メール通知する

会議履歴データを、Outgoing Webhook で Google スプレッドシートに蓄積しつつ、指定したテンプレートで議事録が作成されたタイミングでホストにメール通知する仕組みの実装手順を紹介します。

概要

本ガイドでは、MiiTel Meetings および MiiTel RecPod の会議履歴データを Outgoing Webhook 経由で Google スプレッドシートに自動蓄積し、特定の議事録テンプレートで生成された議事録を任意のメールアドレスに通知する仕組みの実装例をご紹介します。

それでは実装方法を紹介していきますが、まずは全体のシステム像から説明します。

システム構成

今回ご紹介するシステム全体は、下図のようになっています。

MiiTel Meetings または MiiTel RecPod で議事録が生成されると Outgoing Webhook が発火し、Google Apps Script(GAS)がリクエストを受信します。GAS はサーバーレスで動作するため、AWS などのインフラを用意することなく実装できます。

GAS はスプレッドシートへの書き込みと、条件に応じたメール送信(Gmail)を担います。メール通知は、議事録テンプレートのプロンプトに任意のキーワードを仕込んでおくことで、そのテンプレートで生成された議事録のときだけ通知を走らせることができます。

スプレッドシートのシート構成

シート名役割
シート 1(データ)Webhook 受信データが自動蓄積される
対応表ホスト名 ↔ 通知先メールアドレスの対応を管理する

実装方法

それでは、実際の実装方法をご紹介します。

Google スプレッドシートを用意する

まず、会議履歴データの蓄積先となる Google スプレッドシートを用意します。

  1. Google ドライブを開き、新しいスプレッドシートを作成する
  2. 作成したスプレッドシートの URL から、スプレッドシート ID をコピーして控えておく
https://docs.google.com/spreadsheets/d/{スプレッドシート ID}/edit

Google Apps Script(GAS)を作成する

次に、Outgoing Webhook を受信してスプレッドシートへの書き込みとメール通知を行う GAS を作成します。

スクリプトを作成する

  1. https://script.google.com を開き、「新しいプロジェクト」をクリックする
  2. デフォルトで記載されているコードを全て削除し、以下のコードを貼り付けて保存する
⚠️

SHEET_IDTENANT_CODENOTIFY_KEYWORD の 3 箇所を、自身の環境に合わせて変更してください。

const SHEET_ID = 'スプレッドシートのID';   // ← 変更必須
const TENANT_CODE = 'テナントコード';       // ← 変更必須(例: your-tenant)
const NOTIFY_KEYWORD = '#NOTIFY';           // ← 議事録テンプレートに埋め込むキーワード

function doPost(e) {
  // Challenge-Response 処理
  // MiiTel Admin で Outgoing Webhook を保存する際、URL の検証が行われます。
  // このコードでその検証に自動的に応答しています。
  if (e && e.postData) {
    try {
      const body = JSON.parse(e.postData.contents);
      if (body.challenge) {
        return ContentService
          .createTextOutput(body.challenge)
          .setMimeType(ContentService.MimeType.TEXT);
      }
    } catch (err) {}
  }

  const ss = SpreadsheetApp.openById(SHEET_ID);
  const video = JSON.parse(e.postData.contents).video;
  const dataSheet = ss.getSheets()[0];

  // 全ての議事録をスプレッドシートに追記する
  dataSheet.appendRow([
    new Date(),
    video.title,
    video.host?.user_name,
    video.starts_at,
    video.ends_at,
    video.platform,
    video.summary?.raw || '',
    video.id
  ]);

  // NOTIFY_KEYWORD を含む議事録のみメール通知する
  if (video.summary?.raw?.includes(NOTIFY_KEYWORD)) {
    sendNotificationEmail(video);
  }

  return ContentService
    .createTextOutput('OK')
    .setMimeType(ContentService.MimeType.TEXT);
}

function getEmailByHostName(hostName) {
  const ss = SpreadsheetApp.openById(SHEET_ID);
  const masterSheet = ss.getSheetByName('対応表');
  if (!masterSheet) return null;

  const allData = masterSheet.getDataRange().getValues();
  if (allData.length < 2) return null;

  const header = allData[0];
  const nameIdx = header.indexOf('ホスト名');
  const emailIdx = header.indexOf('メールアドレス');
  if (nameIdx === -1 || emailIdx === -1) return null;

  for (const row of allData.slice(1)) {
    if (row[nameIdx] === hostName) return row[emailIdx];
  }
  return null;
}

function sendNotificationEmail(video) {
  const hostName = video.host?.user_name;
  const toEmail = getEmailByHostName(hostName);
  if (!toEmail) return;

  const videoUrl = `https://${TENANT_CODE}.app.miitel.com/app/video/${video.id}`;
  const startsAt = new Date(video.starts_at);
  const dateStr = Utilities.formatDate(startsAt, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm');

  const subject = `【MiiTel】議事録が作成されました:${video.title}`;
  const body = `${hostName} さん

以下の会議の議事録が作成されました。

■ 会議タイトル:${video.title}
■ 開始日時:${dateStr}(JST)
■ 会議履歴リンク:${videoUrl}

━━━━━━━━━━━━━━━━━━━━
【議事録】
${video.summary?.raw || ''}
━━━━━━━━━━━━━━━━━━━━`;

  GmailApp.sendEmail(toEmail, subject, body);
}

function setupSheets() {
  const ss = SpreadsheetApp.openById(SHEET_ID);

  const dataSheet = ss.getSheets()[0];
  if (dataSheet.getRange('A1').getValue() === '') {
    dataSheet.getRange('A1:H1').setValues([[
      '取込日時', '会議タイトル', 'ホスト名',
      '開始時刻(UTC)', '終了時刻(UTC)', 'プラットフォーム',
      'AI議事録', '会議ID'
    ]]);
    dataSheet.getRange('A1:H1').setFontWeight('bold');
  }

  if (!ss.getSheetByName('対応表')) {
    const masterSheet = ss.insertSheet('対応表');
    masterSheet.getRange('A1:B1').setValues([['ホスト名', 'メールアドレス']]);
    masterSheet.getRange('A1:B1').setFontWeight('bold');
  }

  SpreadsheetApp.flush();
  Logger.log('セットアップ完了');
}

シートをセットアップする(初回のみ)

GAS エディタ上部の関数セレクタで setupSheets を選択し、「実行」ボタンをクリックします。

「承認が必要です」というダイアログが表示された場合は「権限を確認」→ Google アカウントを選択 →「許可」をクリックしてください。

スプレッドシートにヘッダー行と「対応表」シートが作成されたことを確認します。

⚠️

setupSheets の実行は初回のみ必要です。

Web アプリとしてデプロイする

GAS を Outgoing Webhook の受信エンドポイントとして公開するため、Web アプリとしてデプロイします。

  1. GAS エディタ右上の「デプロイ」→「新しいデプロイ」をクリックする
  2. 左上の歯車アイコンから「ウェブアプリ」を選択する
  3. 以下の通りに設定する
項目設定値
次のユーザーとして実行自分
アクセスできるユーザー全員(匿名ユーザーを含む)
  1. 「デプロイ」をクリックし、発行された URL をコピーして控えておく
https://script.google.com/a/macros/{ドメイン}/s/xxxxxxxxxx/exec
⚠️

コピーする URL は /exec で終わるものを使用してください。/dev で終わる URL はテスト用のため使用できません。

コードを修正した場合は必ず「デプロイを管理」→「バージョン更新」を行ってください。

通知先メールアドレスを対応表に登録する

スプレッドシートの「対応表」シートを開き、A2 セル以降にホスト名とメールアドレスを入力します。

A 列(ホスト名)B 列(メールアドレス)
山田太郎[email protected]
佐藤花子[email protected]
⚠️

ホスト名は MiiTel 上の表示名と完全に一致させてください。スペースや全角・半角の違いも区別されます。

MiiTel Admin で Outgoing Webhook を設定する

作成した GAS の URL に会議履歴を連携するため、MiiTel Admin で Outgoing Webhook を設定します。

Outgoing Webhook の設定画面を表示する

https://account.miitel.jp にアクセスし、管理者権限があるユーザーでログインします。

⋮⋮⋮ アイコン > Admin > 外部連携 > Outgoing Webhook > 会議履歴タブ を開きます。

「連携設定を追加」をクリックします。

会議履歴連携設定を追加する

以下の値を入力します。

  • 名前: 任意の名前を入力する(例: スプレッドシート連携)
  • URL: GAS のデプロイ URL(/exec で終わるもの)を入力する
  • 追加ヘッダー: 空欄でよい
  • 通知ルール: 「議事録作成完了時」 にチェックを入れる

「保存」をクリックします。正常に保存されると、Challenge-Response が GAS で自動処理され、設定が完了します。

⚠️

「URL が不正です」エラーが表示される場合は、GAS のデプロイ設定で「アクセスできるユーザー」が「全員(匿名ユーザーを含む)」になっているか確認してください。

メール通知用の議事録テンプレートを設定する

メール通知の仕組みは、「議事録の出力に特定のキーワードが含まれているかどうか」で通知を制御しています。そのため、以下の 2 つを対応させて設定します。

① MiiTel 側:議事録テンプレートのプロンプトに任意のキーワードを出力させる

メール通知に使いたいテンプレートのプロンプトに、出力に含めたいキーワードを記載します。キーワードは他の議事録内容と混同しにくい任意の文字列で構いません。

例として、プロンプト末尾に以下のように追記します。

最後に必ず「#NOTIFY」とだけ記載してください。

② GAS 側:NOTIFY_KEYWORD の定数を ① で設定したキーワードに揃える

GAS コード冒頭の NOTIFY_KEYWORD を、① で設定したキーワードと同じ文字列に変更します。

const NOTIFY_KEYWORD = '#NOTIFY'; // ← ① で設定したキーワードに揃える

この設定により、対象のテンプレートで議事録が生成されたタイミングでのみ通知メールが送信されます。複数のテンプレートを使い分けている場合は、通知したいテンプレート 1 つにのみキーワードを出力させることで通知の重複を防ぐことができます。

動作確認

実際に会議録音をアップロードして動作を確認してみましょう。

  1. MiiTel Meetings または MiiTel RecPod に会議録音をアップロードする
  2. 議事録の生成完了を待つ
  3. スプレッドシートのデータシートに行が追記されることを確認する
  4. #NOTIFY キーワード入りのテンプレートで議事録が生成されたとき、対応表に登録したメールアドレスに通知メールが届くことを確認する

うまく動作していれば、下記のような通知メールが届いているはずです。

〇〇 さん

以下の会議の議事録が作成されました。

■ 会議タイトル:△△商談
■ 開始日時:2026/05/20 14:00(JST)
■ 会議履歴リンク:https://your-tenant.app.miitel.com/app/video/xxxxxxxx

━━━━━━━━━━━━━━━━━━━━
【議事録】
(議事録の内容)
━━━━━━━━━━━━━━━━━━━━

お疲れ様でした。本ガイドは以上となります。

いかがでしたでしょうか?本ガイドに沿って実装すると、GAS の定数を 3 箇所変更するだけで別テナントへの横展開も可能な汎用性の高い仕組みを構築することができます。

もし不明点等ございましたら、フォーラムにていつでもご質問ください。