今回はお客さまから「社内で複数の有料Zoomアカウントを使いまわしており、それぞれのアカウントにいちいちログインしてミーティングを作成するのが面倒なので、一つのスプレッドシートから任意のアカウントを指定してミーティングを作成できるようにしてほしい。また、作成したミーティングごとにシートを新たに作成し、そこでミーティングの参加者を管理したい。そして最後にgoogleカレンダーにも反映させたい」とご依頼いただきました。
実際に作成したツールはこちらです。
ご利用される際には、ファイルをご自身のGoogleドライブにコピーしてください。
function onOpen() {
var ui = SpreadsheetApp.getUi();
var menu1 = ui.createMenu('追加Menu');
menu1.addItem('Zoomミーティング一括作成', 'scheduleZoomMeeting');
menu1.addToUi();
}
あらかじめ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']];
}
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();
}
}