K.Y. Design
K.Y. Design
K.Y. Design

GAS×Zoom

外観

今回はお客さまから「社内で複数の有料Zoomアカウントを使いまわしており、それぞれのアカウントにいちいちログインしてミーティングを作成するのが面倒なので、一つのスプレッドシートから任意のアカウントを指定してミーティングを作成できるようにしてほしい。また、作成したミーティングごとにシートを新たに作成し、そこでミーティングの参加者を管理したい。そして最後にgoogleカレンダーにも反映させたい」とご依頼いただきました。

実際に作成したツールはこちらです。
ご利用される際には、ファイルをご自身のGoogleドライブにコピーしてください。

概要

担当

  • コーディング
  • テスト

使用ツール

  • Google スプレッドシート
  • Google Apps Script

GASのコード

上部の「追加Menu」を設定する関数

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  var menu1 = ui.createMenu('追加Menu');
  menu1.addItem('Zoomミーティング一括作成', 'scheduleZoomMeeting');
  menu1.addToUi();
}

Zoom APIを設定する関数

あらかじめZoom App MarketplaceでAPI keyとAPI secretを取得する必要があります。
なお、長くなるので以下には1アカウント分しか掲載しておりません。

//アカウント①
function getZoomAccessToken1() {//変更点
  var ZOOM_API_KEY = ''//変更点
  var ZOOM_API_SECRET = '';//変更点
  var header = { alg: 'HS256', typ: 'JWT' };
  var payload = {
    iss: ZOOM_API_KEY,
    exp: Date.now() + 1800,
  };
  var jsonHeader = JSON.stringify(header);
  var encodedHeader = Utilities.base64Encode(jsonHeader);
  var jsonPayload = JSON.stringify(payload);
  var encodedPayload = Utilities.base64Encode(jsonPayload);
  var signatureHMAC = Utilities.computeHmacSha256Signature(`${encodedHeader}.${encodedPayload}`, ZOOM_API_SECRET);
  var encodedSignature = Utilities.base64Encode(signatureHMAC);
  return `${encodedHeader}.${encodedPayload}.${encodedSignature}`;
}

function getZoomUserId1() {//変更点
  var request = UrlFetchApp.fetch('https://api.zoom.us/v2/users/', {
    method: 'GET',
    contentType: 'application/json',
    headers: { Authorization: `Bearer ${getZoomAccessToken1()}` },//変更点
  });
  var users = JSON.parse(request.getContentText());
  return users.users[0].id;
}

function createZoomMeeting1(topic, startTime, duration) {//変更点
  var meetingOptions = {
    'topic': topic,
    'type': '2',//ミーティングのタイプを入力。1が即時で2が予約。
    'start_time': startTime,//開始時刻を入力
    'duration': duration,//ミーティングの時間を設定
    'timezone': 'Asia/Tokyo',
    'password': '',//パスワードを設定したい場合
    'agenda': '',
    'settings': {
      'host_video': 'true',//ホストのビデオをオンにするか
      'participant_video': 'true',//参加者のビデオをオンにするか
      'cn_meeting': 'false',//ホストが中国からか
      'in_meeting': 'false',//ホストがインドからか
      'join_before_host': 'false',//ホストより前に参加者がミーティングに参加できるようにするかどうか
      'mute_upon_entry': 'false',//入室時にミュートにするかどうか
      'watermark': 'false',//画面共有時に透かしを加えるかどうか
      'use_pmi': 'false',
      'approval_type': '0',//参加者の入室を許可する方法
      'registration_type': '1',
      'audio': 'both',//参加者がどういった手段でミーティングの音声に参加するか
      'auto_recording': 'none',//ミーティングの自動録画設定
      'enforce_login': 'false',
      'enforce_login_domains': '',
      'waiting_room': 'true',//参加者を一度待機させるかどうか
      'alternative_hosts': '',
      'global_dial_in_countries': [''],
      'registrants_email_notification': 'false'
    }
  };
  var request = UrlFetchApp.fetch(
    `https://api.zoom.us/v2/users/${getZoomUserId1()}/meetings`,//変更点
    {
      method: 'POST',
      contentType: 'application/json',
      headers: { Authorization: `Bearer ${getZoomAccessToken1()}` },//変更点
      payload: JSON.stringify(meetingOptions),
    }
  );
  var cont = JSON.parse(request.getContentText('UTF-8'));
  return [cont['join_url'], cont['password']];
}

一括でzoom URL発行&シート作成&カレンダー記入をするための関数

function scheduleZoomMeeting() {

  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName('Zoomミーティングの作成');
  var originalSheet = spreadsheet.getSheetByName('原本');
  var range = sheet.getRange('B5:I13');
  var values = range.getValues().filter(v => v[0]);

  for (var i = 0; i < values.length; i++) {

    //データを整理
    var option = values[i][0];
    var date = Utilities.formatDate(values[i][1], 'Asia/Tokyo', 'yyyy/MM/dd');
    var zoom_date = Utilities.formatDate(values[i][1], 'Asia/Tokyo', 'yyyy-MM-dd');

    if (values[i][2] >= 0 && values[i][2] <= 9) {
      var hour = '0' + values[i][2];
    } else {
      var hour = values[i][2];
    }

    if (values[i][3] >= 0 && values[i][3] <= 9) {
      var minute = '0' + values[i][3];
    } else {
      var minute = values[i][3];
    }

    var zoom_start_time = zoom_date + 'T' + hour + ':' + minute + ':00';

    var duration = values[i][4];
    var zoom_end_time = dayjs.dayjs(zoom_start_time).add(duration, 'm').format();
    var calender_start_time = date + ' ' + hour + ':' + minute;
    var calender_end_time = zoom_end_time.replace(':00+09:00', '').replace('T', ' ').replace(/-/g, '/');
    var topic = values[i][5];
    var host = values[i][6];
    var sheetName = values[i][7];

    //原本タブの複製とデータの入力
    var duplicatedSheet = originalSheet.copyTo(spreadsheet);
    duplicatedSheet.setName(sheetName);
    duplicatedSheet.getRange('B3').setValue(calender_start_time);
    duplicatedSheet.getRange('C3').setValue(host);
    duplicatedSheet.getRange('D3').setValue(option);
    duplicatedSheet.getRange('E3').setValue(duration + '分');
    duplicatedSheet.getRange('F3').setValue(topic);


    //zoomアカウントごとの処理。可読性のためにあえてelse ifでつなげなかった。
    if (option === 'アカウント①') {//変更点
      getZoomAccessToken1();//変更点
      getZoomUserId1();//変更点
      var zoomInfo = createZoomMeeting1(topic, zoom_start_time, duration);//変更点
      duplicatedSheet.getRange('G3').setValue(zoomInfo[0]);
      duplicatedSheet.getRange('H3').setValue(zoomInfo[1]);
      var onlineCalender = CalendarApp.getCalendarById('')
      onlineCalender.createEvent(
        option + topic,
        new Date(calender_start_time),
        new Date(calender_end_time),
        {
          description: 'Zoom URL:' + zoomInfo[0] + '\n' + 'パスワード:' + zoomInfo[1]
        }
      );
    }

    if (option === 'アカウント②') {
      getZoomAccessToken2();
      getZoomUserId2();
      var zoomInfo = createZoomMeeting2(topic, zoom_start_time);
      duplicatedSheet.getRange('G3').setValue(zoomInfo[0]);
      duplicatedSheet.getRange('H3').setValue(zoomInfo[1]);
      var onlineCalender = CalendarApp.getCalendarById('')
      onlineCalender.createEvent(
        option + topic,
        new Date(calender_start_time),
        new Date(calender_end_time),
        {
          description: 'Zoom URL:' + zoomInfo[0] + '\n' + 'パスワード:' + zoomInfo[1]
        }
      );
    }

    duplicatedSheet.showSheet();

  }

}
«
»