Google Apps ScriptでGoogle Chatにメッセージを送る【GAS】 🌴 officeの杜 🥥 您所在的位置:网站首页 scriptchatdt Google Apps ScriptでGoogle Chatにメッセージを送る【GAS】 🌴 officeの杜 🥥

Google Apps ScriptでGoogle Chatにメッセージを送る【GAS】 🌴 officeの杜 🥥

#Google Apps ScriptでGoogle Chatにメッセージを送る【GAS】 🌴 officeの杜 🥥| 来源: 网络整理| 查看: 265

2022年5月3日 / 最終更新日時 : 2023年3月4日 officeの杜 Google Google Apps ScriptでGoogle Chatにメッセージを送る【GAS】

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

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

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

※OpenAIのGPT-3人工チャットAIのAPIを機能として追加。以下のエントリーを参考にしてみてください。

Google ChatのBotにOpenAIのchatGPTを繋げてみた【GAS】

リンク

目次

1 今回利用するスプレッドシート等2 事前準備2.1 Cloud Consoleでの作業2.1.1 APIの有効化2.1.2 Chat APIの構成を作る2.1.3 サービスアカウントの作成2.1.4 秘密鍵の作成2.2 管理コンソールでの作業2.3 スプレッドシートの共有に追加2.4 Google Apps Script側の準備2.4.1 プロジェクトの移動2.4.2 秘密鍵の配置2.4.3 認証用のライブラリを追加する2.4.4 デプロイメントIDを取得する2.4.5 appsscript.jsonに追記2.5 Google Chat側の準備2.5.1 Chatのスペースを作成しIDを取得する2.5.2 チャットボットの追加3 ソースコード3.1 認証用コード3.2 チャット投稿コード3.3 自動応答メッセージのコード3.4 独自のスラッシュコマンドを装備4 Webhookで投稿する方法4.1 Webhookの設置方法4.2 ソースコード5 関連リンク 今回利用するスプレッドシート等 Google Chatに送る - Google Spreadsheet Googleの提供してるテンプレート Google Chat API Reference

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

事前準備

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

Google Cloud Consoleを弄ってみる

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

Cloud Consoleでの作業 APIの有効化

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

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

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

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

Chat APIの構成を作る

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

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

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

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

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

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

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

秘密鍵の作成

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

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

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

管理コンソールでの作業

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

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

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

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

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

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

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

Google Apps Script側の準備

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

プロジェクトの移動

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

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

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

秘密鍵の配置

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

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

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

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

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

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

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

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

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

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

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

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

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

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

appsscript.jsonに追記

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

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

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

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

JavaScript 123 "chat": {    "addToSpaceFallbackMessage": "追加してくれてありがとう!!"},

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

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

Google Chat側の準備 Chatのスペースを作成しIDを取得する

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

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

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

チャットボットの追加

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

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

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

ソースコード 認証用コード

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

JavaScript 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 //認証用各種変数var tokenurl = "https://oauth2.googleapis.com/token" //メニューを構築するfunction onOpen(e) {  let ui = SpreadsheetApp.getUi();  ui.createMenu('▶設定')      .addItem('OAuth認証', 'startoauth')      .addSeparator()      .addItem("メッセージ送信","sendChatMessage")      .addToUi();} //OAuth2認証を実行するfunction startoauth(){  //UIを取得する  let ui = SpreadsheetApp.getUi();    //認証を実行する  let service = checkOAuth();  ui.alert("認証が完了し、Access Tokenを取得しました。")} //アクセストークンテストfunction testAccessToken(){  let service = checkOAuth();  console.log(service.getAccessToken())} //Google DriveにあるサービスアカウントキーのJSONファイルを取得するfunction getServiceAccKey(){  //JSONキーファイルを取得する  //fileIdを取得する  let Properties = PropertiesService.getScriptProperties();  let fileId = Properties.getProperty("jsonman");   //JSONファイルの中身を取得する  let content = DriveApp.getFileById(fileId).getAs("application/json").getDataAsString();  return JSON.parse(content);} //OAuth2.0認証を実行するfunction checkOAuth() {  //JSONファイルの中身を取得する  let privateKeys = getServiceAccKey();    return OAuth2.createService('GoogleCloud:' + Session.getActiveUser().getEmail())  //アクセストークンの取得用URLをセット  .setTokenUrl(tokenurl)    //プライベートキーとクライアントIDをセットする  .setPrivateKey(privateKeys['private_key'])  .setIssuer(privateKeys['client_email'])    //Access Tokenをスクリプトプロパティにセットする  .setPropertyStore(PropertiesService.getScriptProperties())    //スコープを設定する  .setScope('https://www.googleapis.com/auth/chat.bot');}

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

JavaScript 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 //エンドポイントの設定var endpoint = "https://chat.googleapis.com/v1/spaces/";var spaceid = "ここにスペースのIDを入れる"; //サービスアカウントでChatに対して送信するfunction sendChatMessage() {  let ui = SpreadsheetApp.getUi();    //OAuth認証情報を取得  let service = checkOAuth();    //メッセージをAPIへ渡す  try{    if (service.hasAccess()) {      //Access Tokenを取得      let accessToken = service.getAccessToken();       //エンドポイントを構築      let url = endpoint + spaceid + "/messages";       //メッセージを構築      let message = {        "text" :"テストメッセージ送信♥"      }       //送信オプション      let options = {        "method"  : "Post",        "payload" : JSON.stringify(message),         "muteHttpExceptions": true,        "headers": {            "Authorization": 'Bearer ' +  accessToken,            "Content-Type" : 'application/json; charset=UTF-8'          }      }       //urlfetchでリクエスト      var response = UrlFetchApp.fetch(url,options);      console.log(response.getContentText());       //responseを取得する      ui.alert("投稿完了\n");    }  }catch(e){    //エラー発生時    ui.alert("error:" + e.message);  }}

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

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

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

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

JavaScript 1234567891011121314151617181920212223242526272829303132333435363738 //メンションでメッセージを受けた場合に自動応答function onMessage(event) {  var name = "";   if (event.space.type == "DM") {    name = "You";  } else {    name = event.user.displayName;  }  var message = name + " said \"" + evenssage.text + "\"";   return { "text": message };} //スペースにボットを追加した時のウェルカムメッセージfunction onAddToSpace(event) {  var message = "";   if (event.space.singleUserBotDm) {    message = "Thank you for adding me to a DM, " + event.user.displayName + "!";  } else {    message = "Thank you for adding me to " +        (event.space.displayName ? event.space.displayName : "this chat");  }   if (evenssage) {    // Bot added through @mention.    message = message + " and you said: \"" + evenssage.text + "\"";  }   return { "text": message };} //スペースからボットを削除した場合のメッセージfunction onRemoveFromSpace(event) {  console.info("Bot removed from ",      (event.space.name ? event.space.name : "this chat"));}

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

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

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

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

Google Chat APIの構成を開く スラッシュコマンドの項目で、ADD SLASH COMMANDをクリック /kinokoなどのスラッシュコマンドを記述 コマンドIDはこのコマンドに対する明示的なIDで、GAS側でこの値を元にどんなスラッシュコマンドが来たのかを判定します 完了をクリックで使えるようになる。 GAS側のonMessage関数にて、以下のようなコードを追加する JavaScript 123456789101112131415 function onMessage(event) {  if (evenssage.slashCommand) {    let slashman = evenssage;    switch (slashman.slashCommand.commandId) {      case 1:  // 投票コマンド        //ここに投票用のコードを記述する         //引数を取得する        let member = slashman.argumentText;        member = member.replace(" ","");         return { "text":member };    }  }} argumentTextでスラッシュコマンドに対する引数を取得出来ます。今回は/kinoko membernameといった形でスペースで区切って渡して、取得した際にスペースは削除しています。 引数とコマンドの判定を行ったら、あとはGASで色々処理をして、返してあげたりする

図:Cloud Console側設定

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

Webhookで投稿する方法

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

Webhookの設置方法

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

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

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

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

ソースコード

JavaScript 1234567891011121314151617181920212223242526 //webhookurlvar webhookman = "ここにwebhook URLを入れる"; //Webhookに対してメッセージを送り込むfunction pushWebhook() {  //uiを取得  let ui = SpreadsheetApp.getUi();   //メッセージを作成  let message = {    'text' : 'きのこの山が正義!!🍄'  };   //送信オプション  let options = {    'payload' : JSON.stringify(message),    'method': 'post',    'contentType' : 'application/json'  };   //POSTにて送信する  let response = UrlFetchApp.fetch(webhookman,options);   //終了メッセージ  ui.alert("Webhookにメッセージを送信しました。")}

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

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

関連リンク 【Google Chat API】Incoming Webhook を Go で触ってみる Google Chat API  - Developing apps with Apps Script  GoogleChat のREST APIを叩いてみるよ スペース情報をとってくる編 GASでGoogle Chatにメンションでメッセージを送信する方法 Google Apps Script Chat app 【Google Apps Script】GASからGoogleChatにメッセージを送る方法 apps-script-oauth2/samples/GoogleHangoutsChat.gs Apps Script で初めての Google ハングアウト chatbot を作成 GASでhangouts chatのbotを作ってみる 【業務効率化】GoogleChatを自動化するスクリプトをGoogleAppsScript16行で書いていく【もう人間は何もしない】 Google Chat に自動投稿する方法 goo形態素解析APIをGoogle Apps Script(GAS)で利用する方法 Google Workspace 従来のハングアウトのGoogle Chatへの移行のお知らせ twitterHatenaPocket関連記事Google ChatのBotにOpenAIのchatGPTを繋げてみた【GAS】 2023年2月18日 Google Apps ScriptでZoomを操縦出来るようにする【GAS】 2023年4月1日 Google Apps ScriptでKintoneのユーザ一覧を取得する【GAS】 2023年3月31日 Google Apps ScriptでWebex APIを操作する【GAS】 2023年3月17日 Google Apps ScriptでBacklog APIを操作してみた【GAS】 2023年1月21日 Google Apps ScriptからTwitter APIをOAuth2.0認証で使う【GAS】 2023年1月14日 Google Apps ScriptでVault APIを叩く【GAS】 2023年1月11日 Google Apps ScriptでYahooキーフレーズ抽出APIを使う【GAS】 2022年5月13日 Google Apps ScriptでSheets APIを使ったら爆速だった【GAS】 2022年4月16日 VBAからGoogle APIを叩いてみる – IE11廃止対応版 2022年3月22日 カテゴリーGoogle、JavaScript タグ BOTGoogle chatrest apiチャットボット “Google Apps ScriptでGoogle Chatにメッセージを送る【GAS】” に対して3件のコメントがあります。 AN より: 2023年4月10日 10:14 AM

こんにちは。GoogleChatでchatGPTのAPIを利用しチャットできるようにしたいと調べていたらこちらへたどり着きました。 詳細に手順を記載いただきありがとうございます、とても参考になります。

手順通り実施してみて一点躓いた点があり、もし原因がおわかりでしたらご教示いただけないでしょうか。

認証用コードのcheckOAuth関数を実行すると、 let content = DriveApp.getFileById(fileId).getAs(“application/json”).getDataAsString(); の部分でエラーが出てしまいます。 デバッグでcontent 変数がundefinedなのでjsonファイルをうまく取得できないようなのです。 jsonファイルは同アカのドライブへアップし、URLの○部分(https://drive.google.com/file/d/○〇〇/)をjsonmanとしてスクリプトプロパティへ格納しました。

GASからドライブへのアクセス権限がないことも原因かと思い、ドライブAPIを有効にしマニフェストでドライブのスコープを追加してみたのですがエラーは解消しませんでした。

主様で他に実施された設定などはございませんでしょうか?

返信 officeの杜 より: 2023年4月10日 9:33 PM

AN様

officeの杜管理人です。 対象のJSONファイルのIDが間違っていないことを前提に考えた場合であれば、以下のようなコードでも取得できないでしょうか?

var prop = PropertiesService.getScriptProperties(); var fileid = prop.getProperty(“jsonman”)

var file = DriveApp.getFileById(fileid); var jsondata = JSON.parse(file.getBlob().getDataAsString(“UTF-8”));

fileidが○の部分が入ってくる。そして、それを元にDriveAppで取得し、中身をgetblobのgetdataasstringで取得する。

ならどうでしょうか?単純にfileidを元に引っ張ってきてるだけなので、jsonmanにファイルIDが入っていないか、誤っているか?ではないかなと思います。前述のコードもこのコードもどちらでも、JSONファイルの中身を先程試してみたら取得出来ていたので、fileIdがきちんと取得できてるかを確認してみてください。

返信 AN より: 2023年4月13日 11:03 AM

管理人様

返信いただきありがとうございます。 いただきましたコードで試してみたところ、無事取得jsonを取得できました。 全体を通して実行してみたいと思います。 お忙しい中ご連絡いただきありがとうございます。

返信 コメントを残す コメントをキャンセル

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有