GASによるzoom urlとzoom invitationの作成

## 概要
googleのspread sheetから必要事項を取得してzoomのmeetingを作成したかった。

大体sheetに会社の情報が入っていて、オンライン会議をする際にmeeting作成をzoomで行うと思います。

その際に、わざわざzoomのページ開いて、顧客の名前をコピペで入れて、コピペで時間も入れて.....面倒です。

特に、これがスマホからアクセスしていたらめちゃくちゃ面倒なのでsheetからボタン一つで作成できる様にしました。


#実際にやってみた
####これが作成前
![スクリーンショット 2021-05-17 22.07.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274417/9968bae2-8d9c-b508-076d-9f24295b2d1e.png)

作成に必要な会社名、顧客名、日、時間の情報をそれぞれ入れ込む。
その後、作成ボタンをおす。



####これが作成後
![スクリーンショット 2021-05-17 22.06.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274417/5be2d931-72b7-9bae-7997-5e26cef52411.png)
招待状の部分には招待状全文が、メール文面には招待状とメールの文面がそれぞれ自動作成される様になっている。
メールの部分は文字列をくっつけただけなので今回は招待状を作成するまでを追っていこう。


大まかに、3処理
userid取得
meeting作成
invitation取得
だ！

### userid取得

```js
 function getZoomUserId() {
  const request = UrlFetchApp.fetch('https://api.zoom.us/v2/users/', {
  method: 'GET',
  contentType: 'application/json',
  headers: { Authorization: `Bearer ${getZoomAccessToken()}` },
  });
  const users = JSON.parse(request.getContentText());
  return users.users[0].id;
  }


function getZoomAccessToken() {
  const ZOOM_API_KEY = '**************'; // ご自身のAPI KEYを入力
  const ZOOM_API_SECRET = '******************'; // ご自身のAPI SECRETを入力

  const header = { alg: 'HS256', typ: 'JWT' };
  const payload = {
    iss: ZOOM_API_KEY,
    exp: Date.now() + 1800, // 時間設定はご自由に
  };

  // ヘッダーとペイロードをコード化
  const jsonHeader = JSON.stringify(header);
  const encodedHeader = Utilities.base64Encode(jsonHeader);
  const jsonPayload = JSON.stringify(payload);
  const encodedPayload = Utilities.base64Encode(jsonPayload);

  // 署名を符号化した後にコード化
  const signatureHMAC = Utilities.computeHmacSha256Signature(`${encodedHeader}.${encodedPayload}`, ZOOM_API_SECRET));
  const encodedSignature = Utilities.base64Encode(signatureHMAC);

  // 戻り値にTokenを設定
  return `${encodedHeader}.${encodedPayload}.${encodedSignature}`;
}

```

まずzoomのdeveloperサイトからapikeyを作成してください。
https://marketplace.zoom.us/develop/create
appを作成し、その際にkeyが発行されるのでコードに貼り付け。

###meeting作成

```js

function getMeeting(token, userId,topic,descript, startTime,pwd) {
  var data = {
    'topic': '顧客名',
    'agenda': '説明など..,
    'type': 2,   
      //1がinstant meeting, 2がscheduled meeting 他にもいろいろ
    'start_time': '2020-01-11T11:11:11Z',
    'duration': 60,
    'timezone': 'Asia/Tokyo',
    'password': pwd,
      //このdataには自分の設定したい値を入れてください。
  };
  var options = {
    'method' : 'post',
    'contentType': 'application/json',
    'headers': {'Authorization' : 'Bearer ' + token},
    // Convert the JavaScript object to a JSON string.
    'payload' : JSON.stringify(data)
  };
  const response = UrlFetchApp.fetch('https://api.zoom.us/v2/users/' + userId + '/meetings', options);
  var cont = JSON.parse(response.getContentText('UTF-8'));
  // console.log(cont['join_url']); ここでmeetingに参加できるURLが作成される。
```



### invitation取得

```js

var invi_options = {
    'method' : 'get',
    'contentType': 'application/json',
    'headers': {'Authorization' : 'Bearer ' + token},
  };
  const invitation_response = UrlFetchApp.fetch('https://api.zoom.us/v2/meetings/'+cont['id'].toString()+'/invitation',invi_options)
  var invi_cont = JSON.parse(invitation_response.getContentText('UTF-8'));

  //const['id']はmeetingのid
```

最後に、作成したmeetingのidを使ってgetで招待状を問い合わせる。
すると、招待状が取得可能となる。

余談：
めちゃくちゃ長い招待状を短くしたい、余分な文字列を省きたい時には
https://qiita.com/dossy/items/0ae6ee1ae456a8eb8ddf
この辺を見るといいかも。

参考文献：
https://qiita.com/coticoticotty/items/a167b2c6db56dd42a7f7
get_user
https://marketplace.zoom.us/docs/api-reference/zoom-api/users/user
post_meeting
https://marketplace.zoom.us/docs/api-reference/zoom-api/meetings/meetingcreate
get_invitation
https://marketplace.zoom.us/docs/api-reference/zoom-api/meetings/meetinginvitation