Google Apps ScriptでZoomを操縦出来るようにする【GAS】
コロナ禍に入ってから、テレカンことウェブ会議のシステムが一気に日本で普及し、大きく市場にインパクトを与えたのはTeamsでもGoogle MeetでもなくZoomなのは間違いないです(それだけ他のサービスが先行しておきながら、だらしなかったという裏返しでもありますが)
現在でも単発のソリューションにも関わらず、一番利用されてるWeb会議システムであります。そんなZoomもかなり豊富にRest APIが用意されており、ウェブ会議を作ったりライセンスを割り当てたり、様々な事が可能になっています。
そんなZoom APIをGoogle Apps Scriptから叩けるようにしてみました。
目次
今回利用するスプレッドシート
- Zoom API - Google Spreadsheet
ウェブを見てると古いJWTを使った認証方法について記載してるサイトが多いのですが、JWT認証2023年6月を持って廃止されることになっている為、素直にOAuth2ライブラリを使ったOAuth認証で装備しましょう。
事前準備
GAS側の準備
ライブラリの追加
以下の手順でOAuth2 library for Google Apps Scriptライブラリを追加しましょう。
- スクリプトエディタを開きます。
- サイドバーよりより「ライブラリ」の+ボタンをクリック
- ライブラリを追加欄に「1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF」を追加します。
- 今回はバージョンは43を選択してみます。
- 保存ボタンを押して完了
これで、OAuth2.0認証にまつわる様々な関数を手軽に利用できるようになります。
図:ライブラリを追加した様子
コールバックURLを取得する
コールバックURLとは、認証を完了しAccess Tokenを取得したら戻るべきURLを指定するものです。これは、スクリプトIDをもとに作られているので、スクリプトIDを取得して組み立てます。
- スクリプトエディタのサイドバーより「プロジェクトの設定」を開く
- 情報の中にある「スクリプトID」を控えておく。
- https://script.google.com/macros/d/スクリプトID/usercallback として組み立てる。これがコールバックURLとなる。
図:スクリプトIDはファイル毎に異なるのです。
Zoom側の準備
Zoom Developerからログインしてアプリに必要な情報を作成します。以下の手順で登録しましょう。
- こちらのURLにアクセスしてログインする
- 右上のドロップダウンから、Build Appを選択する
- いくつか出てきますが、Google Apps Scriptで使うのはOAuth。Server to Server OAuthではありませんので注意
図:createボタンで作成開始 - App Nameを適当に入れて、Account Level Appを選択。Market Placeのチェックは外しておきます。
図:公開しないのでこの設定で行きます。 - この段階でClient IDおよびClient Secretが手に入ります。控えておきます。
- Redirect URL for OAuthには前述の準備で作ったGAS側のコールバックURLを入れます。Add allow listsにも同様にいれておきます。allow listsにも入れておかないと無効なリダイレクトとなり受け取れないことがあります。
図:allow listにも入れておくのがポイント - 次の画面ではshort descriptionにて、短い説明, company name, Developer Contact Infomationを入れて次へ
- Add Featureでは、特に何もせずに次へ
- 次の画面ではAdd Scopeをクリックして、操作するAPIのスコープを選択。今回はUserとAccountの全部をチェック。この時画面に出てくる「account:read:admin」みたいな文字列がスコープでコード側で使うので全部半角スペースで繋げて控えておきます。
図:目的に応じてscopeを追加する - Activationまで行ったら完了です
ソースコード
認証フローを作成する
以下はOAuthライブラリの認証の認証部分だけのコードです。全体はサンプルシートに含まれているので参照してみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//認証情報 var appid = 'ここにクライアントIDを入れる'; var appsecret='ここにクライアントシークレットを入れる'; var scope = "ここにスコープを入れる"; var authurl = "https://zoom.us/oauth/authorize" var tokenurl = "https://zoom.us/oauth/token" //認証チェック function checkOAuth() { return OAuth2.createService("zoom") .setAuthorizationBaseUrl(authurl) .setTokenUrl(tokenurl) .setClientId(appid) .setClientSecret(appsecret) .setCallbackFunction("authCallback") //認証を受けたら受け取る関数を指定する .setPropertyStore(PropertiesService.getScriptProperties()) //スクリプトプロパティに保存する .setScope(scope) .setTokenHeaders({ 'Authorization': 'Basic ' + Utilities.base64Encode(appid + ':' + appsecret), }); } |
- スコープは、「account:master account:read:admin」のようにスペース区切りで入れておきます。
- 独特なのが、setTokenHeadersを追加する点。ここはAuthorization Basicという形でclientidとsecretをコロンで繋げたものをBase64でエンコードした値を指定します。
- セットが完了したらstartoauthを実行して認証しておきましょう。
図:認証実行ではAllowをクリックして許可する
ユーザ一覧を取得する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
function getZoomUsers() { //uiを取得する let ui = SpreadsheetApp.getUi(); //サービス名を指定 let servicename = "zoom"; //シートを取得する let prop = PropertiesService.getScriptProperties(); let ss = SpreadsheetApp.getActiveSpreadsheet(); let sheet = ss.getSheetByName("ライセンス管理") //トークン確認 var service = checkOAuth(); if(service.hasAccess()) { //エンドポイントを構築 var endpoint = "https://api.zoom.us/v2/users"; //リクエストヘッダ let header = { "Authorization": 'Bearer ' + service.getAccessToken(), "content-type": "application/json" } //リクエストオプション let options = { method: "GET", headers: header, muteHttpExceptions: true } //リクエスト実行 const response = UrlFetchApp.fetch(endpoint, options); //リクエスト結果を取得する const result = JSON.parse(response.getContentText()); //リクエスト結果を配列に格納する var array = []; var uflg = false; var empid = 0; //ユーザ情報を格納する var users = result.users; for(var i = 0;i<users.length;i++){ //レコードを一個取り出す let rec = users[i]; //メアドを取り出す let mail = rec.email; //ユーザ名を取り出す let uname = rec.display_name; //書き込み用一時配列を用意 let temparr = [ rec.id, uname, mail, servicename, ]; //arrayに追加する array.push(temparr) } //スプレッドシートの最終行を取得する let endrow = Number(sheet.getLastRow()) + 1; //スプレッドシートに書き出しする let lastColumn = array[0].length; //カラムの数を取得する let lastRow = array.length; //行の数を取得する sheet.getRange(endrow,1,lastRow,lastColumn).setValues(array); //終了 ui.alert(servicename + "のユーザ一覧を出力しました。") }else{ ui.alert("認証が実行されていませんよ。"); } } |
- ライセンス管理シートの最終行に追加出力します。
- 利用するエンドポイントは、https://api.zoom.us/v2/usersを利用します。
- リクエストは通常通りのOAuth2.0認証によるBearerトークンによるリクエストです。
- 取得したデータをスプレッドシートに一括書き出しをします。
他にもMeeting設置やユーザへのウェビナーライセンス付与、レポート、権限付与など様々なAPIが用意されているので、殆どの操作を自動化することが可能になります。
関連リンク
- Bulk create Google Calendar events with optional Meet or Zoom - the code
- はじめての Zoom API - OAuth編
- はじめての Zoom API - Server-to-server OAuth編
- Zoom APIを使って管理者の作業を楽にしてみる(ライセンス割り当て編)
- Zoomにつないでみた
- Using Zoom API
- Zoom Meeting API - Zoom Developer
- Invalid Redirect(4700) Error when oAuth flow
- Zoom APIの使い方:OAuth・JWT による認証方法・Postman での実行方法
いつも参考にさせていただいております。素人なのですが、2点質問失礼致します。
1.「セットが完了したらstartoauthを実行して認証しておきましょう。」のstartoauthはcheckOAuthの誤字でしょうか?startoauthを見つけられなかったので質問させていただきました。
2. コピペしたコードを実行しました。「認証が許可されていませんよ。」と表示される場合は、Zoomのアプリ側の設定を見直した方がよろしいでしょうか?
ゆならさん
officeの杜管理人です。サンプルファイルの中にあるメニューの認証の実行がstartoauthと紐ついています。
それを実行し、最初のZoom認証を実行することで、Access Tokenを取得して、Zoom APIを叩けるようになるので、まずサンプルをダウンロードして、Client ID等セットアップしてから実行してみてください。