[GAS/Chat]GoogleChatAPIで高度なメッセージを送信しよう

GoogleChatChat

どうも。ケニー(tsujikenzo)です。このシリーズでは 「GASでGoogleChat APIを使いこなそう」 をお送りしています。

前回のおさらい

前回は、Incoming Webhookを使ってGoogle Chatに自動通知を送る方法をご紹介しました。

でも、他にも「ここが解決できたらいいのに…」と思うこと、ありませんか?

  • DM(ダイレクトメッセージ)が送れない…
  • カードメッセージは送れるけど、ただのテキストの延長線上で、もっとリッチにしたい…
  • 双方向のやりとり(ユーザーからの入力を受け取る)は、Webhookではやっぱりできない…

これらの壁を乗り越える手段、それが 「Google Chat API」 です。

今回は、GCP(Google Cloud Platform)の世界に足を踏み入れ、わたしたちの通知ボットを、単なる通知役から 「高機能な通知アプリケーション」 へと昇格させましょう! (※注:今回もまだ「メッセージ送信専用」です。botによる双方向の対話は、次回のお楽しみです!)

対象となる読者

  • GmailやスプレッドシートなどをGASで操作したことがある
  • appsscript.jsonマニュフェストファイルが設定できる
  • GCPという存在は知っているが触ったことがなく苦手
  • PythonやJavaではなく引き続きGASで操作したい

GCP(Google Cloud Platform)とは

Google Chat APIを利用する上で避けて通れない、GCPについて、3つの疑問にお答えします。

  1. なぜGCPが必要なのか
  2. GCPの設定は複雑ではないか
  3. 高額請求は発生しないか

1. なぜGCPが必要なのか? → APIの有効化と認証・認可のため

GASが、スプレッドシートやGmailといったGoogle Workspaceのコアサービスを特別な設定なしに操作できるのは、それらがGASの実行環境と密接に統合されているからです。

いわば、「デフォルトで有効化されているAPI」です。

しかし、Google Chat APIのような、より高度で、外部連携を前提としたAPIは、デフォルトでは有効になっていません。開発者が意図的に有効化する必要があります。

そして、「APIの有効化」や「利用状況の管理」や「認証・認可のプロセス」などを、一元的に管理するプラットフォームが、GCPです。

GCPプロジェクトは、GASが特定の機能群(Chat APIなど)を利用するための「利用申請」「API利用権限の付与」を、おこなう場所です。

1アプリ(スクリプト) = 1GCPプロジェクトの原則

GCPでは、「1つのアプリ(スクリプト、または、そのスクリプトが担う1つの役割)に対して、1つのGCPプロジェクトを用意する」のが、基本の考え方です。

GCPプロジェクトは、あなたのアプリ(スクリプト)のための 「管理台帳」のようなものです。

これから作る「高機能な通知アプリケーション」のために、まず専用の管理台帳を1冊用意する。将来、まったく別の「勤怠管理ボット」を作りたくなったら、その時はまた別の管理台帳を用意する。

こうすることで、アプリ(スクリプト)ごとに「どの道具(API)の使用を許可したか」が明確になり、安全に管理できるようになります。

2. GCPの設定は複雑ではないか? → 必要な手順は限定されている

GCPは非常に多機能なプラットフォームですが、GASはGoogle自身のプラットフォーム上で動作するため、認証やAPI利用権限の付与が、比較的楽に行えます。

PythonやJavaなどの、外部アプリケーションが必要とする 「アクセス認証情報の作成(サービスアカウントキーの発行など)」 は不要です。

われわれが事前に行う設定は、以下の5つだけです。

  1. GCPプロジェクトの作成: APIやリソースを格納するための、論理的なコンテナ(入れ物)を作成する(GCP)
  2. OAuth同意画面の構成: アプリケーションがユーザーデータにアクセスする際に表示される同意画面の情報を設定する(GCP)
  3. GASプロジェクトとの紐付け: 作成したGCPプロジェクトを、GASの「標準プロジェクト」として関連付ける(GCP/GAS)
  4. Google Chat APIの有効化: ライブラリからGoogle Chat APIを検索し、プロジェクトで利用できるように有効化する(GCP)
  5. Google Chat APIの「構成」からアプリ情報を登録する(GCP)

このブログでは、これらの手順を、1つずつスクリーンショット付きで解説していきます。

3. 課金は発生しないか? → Chat APIの標準利用は無料の割り当て範囲内

Google Chat APIの利用料金について、多くの開発者が「思わぬ高額な請求が発生するかも」という懸念を抱くと思います。

しかし、Google Chat APIには、無料の利用割り当て(クォータ)が設定されており、通常のアプリケーション利用でこの上限を超えることは、まずありません。

公式の割り当てドキュメントでは、たとえば 「1分あたりのクエリ数」などが定められていますが、これはAPIの乱用を防ぐためのものであり、直接的な課金体系ではありません。

プロジェクトごとのメッセージ書き込み上限:3000回/分

あなたのGASプロジェクト全体で、1分間に3000回までメッセージを送れる、という意味です。つまり、1秒間に50回です。個人やチームの通知で、これを超えることはまず考えられません。

スペースごとのメッセージ書き込み上限:60回/分

1つのスペースに対して、1分間に60回までしか書き込めない、という意味です。言い換えれば、「1秒に1回、同じ部屋にメッセージを連投し続けても、まだ上限に達しない」ということです。システムのアラートが1秒間に何十回も発生するような異常事態でもない限り、この制限に引っかかることは、まずないでしょう。

出典: Google Chat APIの使用制限

それでは、GCPのGoogle Chat APIを使った、高機能な通知アプリケーション作成にチャレンジしてみましょう。

事前準備の設定をしよう

まずは、全体の流れです。大きく分けて、GCPGASGoogle Chatの3種類の手順があります。

  1. GCPプロジェクトを作成する (GCP)
  2. OAuth同意画面を構成する (GCP)
  3. GASプロジェクトとGCPプロジェクトを紐付ける (GAS / GCP)
  4. Google Chat APIを有効にする (GCP)
  5. Google Chat APIの「構成」からアプリ情報を登録する (GCP)
  6. Chatスペースにアプリ(もしくは自分自身)を追加する (Chat)
  7. GASからメッセージを送信する (GAS)

1つずつ、スクリーンショットを交えて説明します。

1. GCPプロジェクトの作成

Bussiness以上のアカウントで、Google Cloudコンソールにログインします。

Google Cloud Platform
Google Cloud Platform lets you build, deploy, and scale applications, websites, and services on the same infrastructure as Google.

プロジェクト名(プロジェクトの選択)をクリック、もしくはショートカットキーのCtrl+Oを押して、プロジェクト選択ツールを開きます。 

「新しいプロジェクト」をクリックします。 

プロジェクト名を入力して、「作成」をクリックします。 

プロジェクトが選択できるようになれば、成功です。 

あとは、作成したGCPプロジェクト番号をメモしておきます。まず、ナビゲーションメニュー()をクリックします。 

「Cloudの概要」から「ダッシュボード」をクリックします。 

プロジェクト情報に、プロジェクト番号があるのでメモしておきましょう。 

2. OAuth同意画面の構成

GCPプロジェクトを作成したら、次に、GASプロジェクトと紐付ける前に、必ず「OAuth同意画面」の構成を完了させる必要があります。

なぜ、この手順が先に必要なのか?

ここで設定する「OAuth同意画面」とは、あなたのスクリプトが将来、ユーザーのデータにアクセスする許可を求める際に表示される、公式な「身元保証」画面のことです。

Googleのセキュリティモデルでは、Chat APIのような高度なAPIを利用するGCPプロジェクトは、たとえ現時点で同意を必要としなくても、その 「アプリケーションとしての身元情報(アプリ名や連絡先など)」を事前に登録しておくことが必須と定められています。

これは、「アプリ(スクリプト)を作る」作業ではありません。プログラム本体のロジックを記述するのではなく、あくまで、そのプログラムがGoogleの世界で「どのような名前で、誰によって管理されているのか」を定義する、純粋な管理上の手続きです。

ナビゲーションメニューの「APIとサービス」から「OAuth同意画面」をクリックします。

左メニューから「ブランディング」をクリックします。 

ブランディングが表示されたら「開始」をクリックします。 

プロジェクト構成が表示されたら、アプリ情報は、「アプリ名」と「メールアドレス」を入力します。自由な名前で構いません。最後に「次へ」をクリックします。 

対象は、「内部」にチェックを入れます。

連絡先情報は、メールアドレスを入力します。「次へ」をクリックします。 

最後に、ポリシーに同意するにチェックを入れて「作成」をクリックします。 

3. GCPプロジェクトとGASプロジェクトの紐付け

スタンドアロンスクリプトを作成します。※割愛します

プロジェクトの設定を開き、Google Cloud Platform(GCP)プロジェクトの「プロジェクトを変更」をクリックします。 

プロジェクト番号を入力して、「プロジェクトを設定」をクリックします。 

紐づけが完了しました。

4. Google Chat APIの有効化

GCPに戻ります。ナビゲーションメニューの「APIとサービス」から「ライブラリ」をクリックします。

APIライブラリが表示されたら、検索ボックスに「Chat」と入力してEnterを押します。 

検索結果の中から、Google Chat APIをクリックします。 

「有効にする」をクリックします。 

この後の工程でエラーが発生したばあい、かならず「Google Chat APIが有効になっているか?」という確認があります。

現在作業中のGCPプロジェクトで、APIが有効になっているか、必ず確認しましょう。 

  1. Google Chat APIのアプリ情報を登録する Chat APIを有効にしただけでは不十分で、そのAPIを利用する「アプリ」自体の情報を、Google Chatのシステムに登録する必要があります。

「APIとサービス」から「有効なAPIとサービス」をクリックします。 

少し下にスクロールして、「Google Chat API」をクリックします。 

「構成」タブをクリックします。 

アプリケーション情報の「アプリ名」は、Chatを送信したときに表示されるので、分かりやすい名前がいいでしょう。 

以下のような表示になります。

「アバターのURL」は、自由に設定できるのですが、こだわりがなければ以下(よくあるロボットのアイコン)をコピペしてください。

https://developers.google.com/chat/images/quickstart-app-avatar.png

接続設定は、「HTTPエンドポイントURL」にチェックを入れて、トリガーは「すべてのトリガーに共通のHTTPエンドポイントURLを使用する」にチェックを入れます。 

「説明」は、適当に、日本語OKです。 

トリガーの「HTTPエンドポイントURL」は、メッセージを受信したりするときに使うものなので、今は必要ありません。しかしながら必須項目となっているので、なにかしらのURLを入力しましょう。(わたしはYahooを入れてますが、意味はありません) 

公開設定のメールアドレスを入力します。 

最後に、「SAVE」をクリックします。 

Chatスペースにアプリ(自分自身)を追加する

Google Chatに移動します。GCPプロジェクトに紐づいたGASからメッセージを送信するためには、Chatスペースにアプリ(もしくは、自分自身)を追加する必要があります。

タイトル横の▼をクリックして、「メンバーの管理」をクリックします。 

「+追加」をクリックします。上記でアプリを作成したユーザーのアカウントを追加します。 

リストに表示されたらOKです。 

GASプロジェクトを設定する

前述したとおり、Gmailやスプレッドシートを操作するGmailAppやSpreadsheetAppは、GASに標準で組み込まれているサービスです。特別な設定なしに、いきなりコードを書き始めることができました。

しかし、Google Chat APIのような、より専門的で強力なAPIは 「高度なGoogleサービス(Advanced Google Services)」として扱われ、利用するには「このスクリプトで、この高度なサービスを使います」という明確な宣言が、GASプロジェクト側で必要になります。

Chat.と入力するだけで、SpacesやMessagesといった利用可能なオブジェクトの候補が表示されるようになり、開発が劇的に楽になります。

同様に、GASプロジェクトに、ChatAPIのスコープを設定する必要があります。

この2つの設定方法を、appsscript.jsonファイルでいっぺんに行うことができます。

GASに移動します。追加するスコープは、以下の2つです。

"oauthScopes": [
  "https://www.googleapis.com/auth/chat.messages",
  "https://www.googleapis.com/auth/script.external_request"
]

完成したappsscript.jsonファイルは、こんな感じです。

{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
    "enabledAdvancedServices": [
      {
        "userSymbol": "Chat",
        "version": "v1",
        "serviceId": "chat"
      }
    ]
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes": [
    "https://www.googleapis.com/auth/chat.messages",
    "https://www.googleapis.com/auth/script.external_request"
  ]
}

保存しましょう。

サービスに「Chat」が追加されたらOKです。 

動作確認!最初のAPI経由メッセージを送信

さぁ、準備は整いました。GASからスペースへメッセージを送信してみましょう。

まず、スペースIDを確認します。スペースIDは、ブラウザのURLで確認できます。 

GASを書きます。

function sendMessageViaApi() {
  const spaceName = 'spaces/AAAAC***'; // 投稿先のスペースID
  const message = {
    text: 'Google Chat API経由のメッセージです。'
  };

  Chat.Spaces.Messages.create(message, spaceName);
}

保存したら、sendMessageViaApi()関数を実行します。スペースに、メッセージが受信できていれば成功です。 

DMを送信してみよう

最後に、Webhookでは絶対に不可能だった、特定のユーザーへのDM(ダイレクトメッセージ)送信に挑戦しましょう。

DM送信は「2ステップ」の手順があります。

  1. Step 1:相手との「DM専用スペース」を検索する まず、Chat.Spaces.findDirectMessage()という特別な関数を使って、DMを送りたい相手との、1対1のプライベートな部屋の「住所(スペースID)」を、Googleに尋ねます。
  2. Step 2:見つけ出したスペースに、メッセージを送信する Googleから教えてもらった、そのDM専用の「住所(スペースID)」を使って、これまでと同じChat.Spaces.Messages.create()関数で、メッセージを送信します。

この「まず、スペース(部屋)を探す」という一手間こそが、Incoming Webhookには不可能だった方法です。

スコープを追加する

スペースを探すためのスコープを、追加する必要があります。

以下の2つのスコープを、appsscript.jsonファイルに追加しましょう。

"https://www.googleapis.com/auth/chat.spaces",
"https://www.googleapis.com/auth/chat.spaces.create"

DMを送信するための、完全なコード

DM送信するための、2つのステップを、GASで実装したコードがこちらです。

/**
 * Google Chat APIを使い、特定のユーザーにDMを送信するための関数
 * 公式ドキュメントの「findDirectMessage」メソッドに基づき、GASで実装
 */
function sendDmTheOneTrueWay() {
  try {
    const userEmail = 'hoge@gmail.com'; // DMを送りたい相手のメールアドレス

    // ---------------------------------------------------------------------
    // ▼ Step 1: 相手とのDMスペースを「検索」する ▼
    // ---------------------------------------------------------------------
    
    // 検索するためのリクエストを作成
    // Node.jsの `name: 'users/USER_NAME'` に相当します。
    // GASでは、emailを直接指定できます。
    const request = {
      name: `users/${userEmail}`
    };

    // Chat APIを呼び出し、DMスペースを検索
    const dmSpace = Chat.Spaces.findDirectMessage(request);
    
    // 見つけ出したDMスペースのIDを取得
    const spaceName = dmSpace.name;

    // ---------------------------------------------------------------------
    // ▼ Step 2: 取得したスペースIDを使って、メッセージを送信する ▼
    // ---------------------------------------------------------------------

    const message = {
      text: `【🎊🎊🎊🎊🎊】これはGASから送信されたDMです。`
    };

    // メッセージを送信する部分は、これまでと同じ!
    Chat.Spaces.Messages.create(message, spaceName);

    Logger.log(`'${userEmail}'へのDM送信に成功しました。`);

  } catch (e) {
    Logger.log(`DMの送信に失敗しました: %s`, e.stack);
  }
}

ポイント解説

  • findDirectMessage()メソッドが鍵: このメソッドこそが、特定のユーザー(例: users/kenny@…)を、メッセージ送信可能な**「場所(spaces/…)」**に変換してくれる、唯一の「翻訳機」です。
  • 権限について: このスクリプトを実行するあなたのアカウントは、DMを送信する相手と同じGoogle Workspace組織に所属している必要があります。組織外のユーザーにDMを送ることは、通常できません。

さあ、sendDirectMessage()関数を実行してみましょう。

あなたのChat画面に、Botから直接、あなた宛てのメッセージが届けば、大成功です! 

まとめ

以上で、「GoogleChatAPIで高度なメッセージを送信しよう」をお届けしました。

※ちょっと長すぎましたね。反省しております💦

そして、とくにGCPプロジェクトとGASプロジェクトの紐づけや、認証設定を習得したことで、Google謹製のAPIを操作する幅が一気に広がったと思います。

次回は、最終回で、双方向のやりとりを実現する、「GoogleChat カスタムアプリ」をお届けします。お楽しみに。

参考資料

このシリーズの目次

  1. [GAS/Chat]GoogleChatでLINE Notifyから移行しよう
  2. [GAS/Chat]GoogleChatAPIで高度なメッセージを送信しよう
  3. [GAS/Chat]【ハンズオン】「カスタムアプリ」でオウム返しBotを作ろう!

タイトルとURLをコピーしました