どうも。ケニー(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つの疑問にお答えします。
- なぜGCPが必要なのか
- GCPの設定は複雑ではないか
- 高額請求は発生しないか
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つだけです。
- GCPプロジェクトの作成: APIやリソースを格納するための、論理的なコンテナ(入れ物)を作成する(GCP)
- OAuth同意画面の構成: アプリケーションがユーザーデータにアクセスする際に表示される同意画面の情報を設定する(GCP)
- GASプロジェクトとの紐付け: 作成したGCPプロジェクトを、GASの「標準プロジェクト」として関連付ける(GCP/GAS)
- Google Chat APIの有効化: ライブラリからGoogle Chat APIを検索し、プロジェクトで利用できるように有効化する(GCP)
- 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秒間に何十回も発生するような異常事態でもない限り、この制限に引っかかることは、まずないでしょう。
それでは、GCPのGoogle Chat APIを使った、高機能な通知アプリケーション作成にチャレンジしてみましょう。
事前準備の設定をしよう
まずは、全体の流れです。大きく分けて、GCPとGASとGoogle Chatの3種類の手順があります。
- GCPプロジェクトを作成する (GCP)
- OAuth同意画面を構成する (GCP)
- GASプロジェクトとGCPプロジェクトを紐付ける (GAS / GCP)
- Google Chat APIを有効にする (GCP)
- Google Chat APIの「構成」からアプリ情報を登録する (GCP)
- Chatスペースにアプリ(もしくは自分自身)を追加する (Chat)
- GASからメッセージを送信する (GAS)
1つずつ、スクリーンショットを交えて説明します。
1. GCPプロジェクトの作成
Bussiness以上のアカウントで、Google Cloudコンソールにログインします。
プロジェクト名(プロジェクトの選択)をクリック、もしくはショートカットキーの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が有効になっているか、必ず確認しましょう。 
- 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ステップ」の手順があります。
- Step 1:相手との「DM専用スペース」を検索する まず、Chat.Spaces.findDirectMessage()という特別な関数を使って、DMを送りたい相手との、1対1のプライベートな部屋の「住所(スペースID)」を、Googleに尋ねます。
- 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 カスタムアプリ」をお届けします。お楽しみに。



