Google Apps ScriptでGoogle Chatにメッセージを送る

Google Apps Scriptには、Google Chatに送る為のメソッド類は装備されていません。Google ChatはREST APIとして提供されているので、Google Apps Scriptで利用する場合は、このAPIを叩いて送信する必要があります。

Webhookを利用して送りつける方法はあるのですが、自動化などで利用する場合には、そのWebhook URLを知っておく必要がある上に送信しか出来ないので、色々と不便です。そこでこのAPIを利用して色々出来ないか調べてみました。

※いわゆるチャットボットになります。

今回利用するスプレッドシート等

今回のスクリプトは事前準備がかなり大変なので、一個作っておいて使いまわしするような形で運用すると良いでしょう。

事前準備

面倒なことに、Google Chat APIを叩く為にはサービスアカウントの準備等が必要のようで、Google Apps Scriptから叩くには手間が必要になっています。予め、Cloud Consoleにプロジェクトは用意しておいてください。このあたりの情報は以下のエントリーにまとめてあります。今回は、サービスアカウントの作成から開始します。

Google Cloud Consoleを弄ってみる

Google Apps Scriptで画像から文字起こしを実現する

Cloud Consoleでの作業

APIの有効化

Cloud ConsoleのGoogle Chat APIを有効化しておきます

  1. サイドバーから「APIとサービス」⇒「有効なAPIとサービス」を開きます
  2. APIとサービスの有効化をクリック
  3. 検索窓でchatと入れて検索すると、Google Chat APIが出てくるのクリック
  4. 有効化をクリックする

今回は認証はOAuth2.0認証ではなくサービスアカウントでの認証となるのでこれでOK

図:まずはAPIを有効化しておきましょう

Chat APIの構成を作る

有効化したChat APIを開いて、構成の中身を構築します。これがBotとなり、スクリプトからのメッセージを変わりに投稿してくれます。

  1. Google Chat APIを開く
  2. 構成タブを開く
  3. アプリ名を適当につける(今回はchatmanとしました)。これを控えておきます。
  4. アバターのURLは今回は、こちらのURLを利用しました。
  5. 機能の2つのチェックボックスをオンにします
  6. 接続設定はApps Script Projectをチェックします
  7. デプロイIDですが、後半にあるデプロイメントIDを取得するを参考に先にApps Scriptのデプロイを実行してDeployment IDを取得して入れます。
  8. 権限はドメイン内の全メンバーとしました

図:これがChatbotの設定になります

サービスアカウントの作成

まずは、Google Chat用のサービスアカウントを用意します。

  1. サイドバーから「IAMと管理」⇒「サービスアカウント」を開きます
  2. 上部にあるサービスアカウントを作成をクリックする
  3. サービスアカウント名、IDを適当にセットし、作成して続行をクリック
  4. このサービス アカウントにプロジェクトへのアクセスを許可する」の項目は省略して進める。続行をクリック。
  5. ユーザーにこのサービス アカウントへのアクセスを許可」も同様に省略して進める。完了をクリック。
  6. これで、サービスアカウントの作成が完了。すると、アカウント名@プロジェクト名.iam.gserviceaccount.comでアカウントが出来ます。
  7. サービスアカウントの「一意のID」は後で利用するので控えておきます

図:サービスアカウント自体は作るのは簡単

秘密鍵の作成

このままだと、このサービスアカウントが誰でも利用可能な状態なので、秘密鍵を作成します。

  1. 作ったサービスアカウントをクリックして開く
  2. キータブをクリックする
  3. 鍵を追加をクリックして、新しい鍵を作成をクリック
  4. キーのタイプをJSONとして、作成をクリック
  5. 鍵が作成されて、JSONファイルがダウンロードされます。
  6. このファイルは大切に保管しておき漏洩しないように注意が必要です。

図:秘密鍵は必ず作成しておきます。

管理コンソールでの作業

Google Workspaceの管理コンソールでも作業が必要になります。

  1. 管理コンソールの「セキュリティ」⇒「APIの制御」⇒「ドメイン全体の委任」を開きます
  2. APIクライアントの新規追加をクリック
  3. クライアントIDに控えておいた「一意のID」を追加する
  4. Scopeには、「https://www.googleapis.com/auth/chat.bot」を追加する

これで、Google Workspace内で利用が可能になります。

図:管理コンソールでAPI利用の許可をする

スプレッドシートの共有に追加

サービスアカウントに対して、スプレッドシートの読み書きなどの作業が伴う場合には、スプレッドシートの共有設定に予め控えておいた「サービスアカウント」のアドレスを追加し、許可してあげる必要性があります。

図:サービスアカウントからの読み書き許可

Google Apps Script側の準備

このままでは、Google Apps Scriptから操作が出来ないので、以下の作業をしてあげます。

プロジェクトの移動

Google Apps ScriptとCloud Consoleのプロジェクトを紐付けする作業が必要です。以下の手順でプロジェクトの変更を行います。

  1. Cloud Console側のプロジェクトのホームを開き、「プロジェクト番号」を控えておく
  2. Google Apps Scriptのスクリプトエディタを開く
  3. サイドバーからプロジェクト設定を開く
  4. GCPプロジェクトの「プロジェクトを変更」をクリック
  5. GCPのプロジェクト番号に、1.の番号を入力して、プロジェクトを設定をクリック
  6. これで紐付けが完了しました。

図:プロジェクトの移動も必須の作業です

秘密鍵の配置

サービスアカウント作成時にダウンロードされた秘密鍵ですが、これをGoogle Apps Scriptから利用する必要があるので、Google Driveにアップロードします。但しこのファイルは誰かと共有しないようにする必要があります。よって、アクセス権限は自分のみとし、流出しないようにします。

また、Google Apps Scriptから参照する為に、このアップロードしたファイルのIDを控えておきます。スクリプトから参照して値を取り出すのに必要です。自分の場合はこのファイルのIDをスクリプトプロパティに格納しておきます。

※スクリプトプロパティにJSONの中身を全部コピペする方法もありますが、流出注意。

図:秘密鍵のIDをスクリプトプロパティに入れておく

認証用のライブラリを追加する

秘密鍵のJSONファイルを使ってサービスアカウントの認証をする為に、Google Apps Scriptにライブラリを追加します。以下の手順でOAuth2 for Apps Scriptライブラリを追加しましょう。

  1. スクリプトエディタを開きます。
  2. サイドバーより、ライブラリの+アイコンをクリックする
  3. ライブラリを追加欄に「1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF」を追加し、検索します。
  4. 現時点ではバージョンは41が最新ですので、それを選択しておきます。
  5. 追加ボタンを押して完了

これで、OAuth2.0認証にまつわる様々な関数を手軽に利用できるようになります。

図:OAuth2.0認証ライブラリを追加する

デプロイメントIDを取得する

GCP側の構成で利用するIDとなります。

  1. デプロイをクリックし、新しいデプロイをクリック
  2. アドオンのまま、デプロイをクリックすると、Deployment IDが出てくるのでこれをコピーする

このIDをセットしないと、API実行時に「No bot associated with this project.」として404エラーが返ってきます。また、コードを変更したら、再度バージョンを変更してデプロイしないと反映しないので、要注意です。

図:これがないと、404エラーとなってしまう

appsscript.jsonに追記

以下の手順で文字列を追記します

  1. スクリプトのプロジェクト設定を開き、「appsscript.json」マニフェスト ファイルをエディタで表示するにチェックを入れる
  2. appsscript.jsonが表示されるので開く
  3. runtimeVersionの行の下にでも、以下の1行を追記する
  4. 上書き保存する

このappsscript.jsonの記載ですが、公式ではV8ランタイムでは動かないということなのですが、自分のほうでは動作しています。気になるようならば、V8 Runtimeの記載は削除して旧式のランタイムで動かすと良いでしょう。

ちなみに、上記ではメッセージナシの文字列ですが、実際には

みたいな形で記載すると、スペース追加時に自動メッセージが出るらしいです。ただ、後述してるonAddToSpace関数があるので、特にここで記述する必要性はありません。

図:謎の文字列を追記しておきます

Google Chat側の準備

Chatのスペースを作成しIDを取得する

今回はGoogle Chatのスペースに対してチャットをぶん投げるので、「キノコを語る会」というスペースを作成。その後URLを取得します。

  1. Google Chatを開く
  2. スペースの横の+アイコンをクリックして、スペースを作成をクリック
  3. スペース名を適当につける(今回はキノコを語る会とした)
  4. スペースのアクセスは、ドメイン全体を選択しておく
  5. 作成をクリックするとスペースへのURLが出る。「https://mail.google.com/chat/u/0/#chat/space/」に続けて表示されてるのが、スペースのIDとなるので、これを控えておく

図:スペースのIDをもってメッセージを送信する

チャットボットの追加

チャットの左上にある+アイコンをクリックして、チャットボットを追加します。GCP側で設定しておいた構成で出てきますので、これを追加します。追加しないと、APIのみではメッセージ投稿が出来ないので、注意が必要です。

  1. 左上の+アイコンをクリックし、Botを検索をクリック
  2. Chat APIの構成を作るで控えておいたアプリ名を元に検索(今回はchatmanです)
  3. 検索結果に出てくるので、選んで、スペースに追加をクリック
  4. 追加するスペース名を選択して「追加」をクリックすると準備完了

図:これでチャット自動投稿の準備完了

ソースコード

認証用コード

サービスアカウントの認証用のコードです。startoauthを実行してAccess Tokenを取得できればOK。

  • スプレッドシートのメニューの「設定」⇒「OAuth認証」を実行すると実行されます。
  • この認証方式はサービスアカウントが認証を行うので、いつものユーザが認証するものとは異なり、Access Token取得は自動で行われます。
  • 取得したアクセストークン等の塊は、OAuth2ライブラリ最新版より、スクリプトプロパティではなくユーザプロパティに格納されているので、より安全になっています。

チャット投稿コード

  • 控えておいたスペースのIDをspaceidに記述しておきます。
  • OAuth2.0ライブラリによって、Access Tokenの取得が行われ、UrlfetchAppにてPOSTリクエストします。
  • 今回のコードは単純に新規スレッドに投稿してるだけなので、毎回新規スレッドになりますが、responseの中にスレッドIDがあったりするので、それを元にスレッドに対して返信も可能です。

図:botとしてchatmanが投稿してくれました

自動応答メッセージのコード

Google公式のGoogle Apps Scriptのテンプレートを見ると、onMessageといった特殊なシンプルトリガーみたいな関数が用意されています。これらは、メンションでchatbotに対してメッセージを投稿した場合や、スペースにボットを追加・削除した場合に発動する特別な関数です。

  • eventの中にメッセージのタイプやら内容やらが詰まってるので、これを元に判定して返したりします。
  • 日本語形態素解析APIのようなものを合わせて使う事で、チャットの内容を解析し、スプレッドシートの内容を検索して返すといったようなロボットを作る事が可能です。
  • 他にもインタラクティブカードというタイプの返答をしたりも可能のようです。
  • Slackのようなスラッシュコマンドもサポートしています。
  • 自動応答メッセージでダイアログを表示して返答を受け付けるといったような機能も装備しています。
  • 単純なボットというだけでなく、かなり色々とできそうな機能が装備されてるので、作り込み次第では、かなり業務軽減になる可能性を秘めていると思います。

図:オウム返しする自動ボット

独自のスラッシュコマンドを装備

Slackなどでよく見かける「スラッシュコマンド」。例えば、/member 社員番号と入れると部署名やらメアドやらの情報を返すといったようなコマンドをGoogle Apps Script側で構築することが可能になります。Chat APIの構成からセットアップが必要です。

  1. Google Chat APIの構成を開く
  2. スラッシュコマンドの項目で、ADD SLASH COMMANDをクリック
  3. /kinokoなどのスラッシュコマンドを記述
  4. コマンドIDはこのコマンドに対する明示的なIDで、GAS側でこの値を元にどんなスラッシュコマンドが来たのかを判定します
  5. 完了をクリックで使えるようになる。
  6. GAS側のonMessage関数にて、以下のようなコードを追加する

    argumentTextでスラッシュコマンドに対する引数を取得出来ます。今回は/kinoko membernameといった形でスペースで区切って渡して、取得した際にスペースは削除しています。
  7. 引数とコマンドの判定を行ったら、あとはGASで色々処理をして、返してあげたりする

図:Cloud Console側設定

図:スラッシュコマンドを打ってみた

Webhookで投稿する方法

単純に機械的に投稿するだけ、ということであれば前述でも出てきた「Webhook」を設置して、そのURLに対してGoogle Apps Scriptで叩くだけでも投稿可能です。ただし投稿するだけなので、一方的な通知等といった用途に限られます。

Webhookの設置方法

まずはWebhookを設置してそのURLを取得します。

  1. Google Chatを開き、対象のスペースを開く
  2. 上のほうにある「スペース名▼」をクリックして、Webhookを管理をクリック
  3. 着信Webhookのダイアログが出るので、名前とアバターのアイコンURLを指定して、保存をクリック
  4. URLが出るので、コピーアイコンをクリックして、URLをコピーする。

図:ちょっとわかりにくい場所にある

図:このURLに対してGASで叩く

ソースコード

  • POSTで送信する必要があります。
  • メッセージはJSON.stringifyで括ってから送信する必要があります。

図:簡単に通知投稿が可能です。

関連リンク

共有してみる:

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください