GAS(Google Application Script)に戻る
目次
概要
ソースコード
const getAccessToken = () => {
const time = Date.now();
const header = Utilities.base64Encode(JSON.stringify({ 'alg': 'RS256', 'typ': 'JWT' }));
const claimSet = Utilities.base64Encode(JSON.stringify({
'iss': "YFBnvE470S8NLSaPt5JM",
'sub': "z1in3.serviceaccount@works-396230",
'iat': Math.floor(time / 1000),
'exp': Math.floor(time / 1000 + 3600)
}));
const privateKey = "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsuKFHT1x9qjPDtz//v4A5Zmcb2+d1rDwOt9+lf/diL8T6cQyWiMqF1JTXz1NhgCVoCqOpIpPlv/nEHkM0At8CMAmeY1i4HEQhMeONCsPhnQIbwygU9UEzaACP1N7yFwexbyMBSTbw8se3OQ48opF4gGAJNbVQFcj0AjxfYpyskUBHw2Tvjzf+xICmiqhL3SauMjdIkhHH5qzr0DHOc7/NVjOfHgSuF6Kp6K0HfbNIDpmCyz+xfJ5ggGOFW/TFXuFO+S/Cd9Cjff2OSIEB1PftBHuiSPQLwQx9n8lj5Okn3gytWraLsxF7tk14TfOTvtgJizbWV9YOebqx8DL9FW3AgMBAAECggEAK/TBNZdkKP9abUAGTJJf2xCEsszSHhHGXPrlHI8gQ7WhF6U4nYrfKypEy6blJ7CJje5E+tHHz8I9AK8wVvspTTNUcuIa73V+inhIYAL8E9pcycKXF3QwY47sDu5Ob6FWXc11pvGfn+SLbmLlNqEyMzLjg4vrX0apM3uW+grNhxtJRLxv7FrsQ+WgtzgNbOkWxGrLa1cwbFDZ3TM4pijVibKCxg9QUgZRrqhTNanNmjTm0EVakO/ZV0zjLmYSlgevzWMcfDOZA5KBopGd/LBPENIXhj14X4zaO7upG+HS0QoeFlyQuiO1rKpiLoJyOihv/Q0sXKikH8n/FQMTDi52oQKBgQC9end8OirBdIzjg9GQCeXZmzIoJjp9AJGhnWTqpQv0KPQycvMkX7VslLo4qocK4zU7/CAUhZTKh39/gMlvD3Gp41m4rK1H2OMXP3/mixbJBWSajXBKyTqzjZqldv8eFdit2bgqVIcYIrNmdAvkzQc561Tdg2/+/fYKjDyC9fT5ZwKBgQC3Vu2+OU7iF4mSfXjTcxF2dyTnYOGlldCe6+bskIyR1mkhuFRGYc+KkTkJo12NxOo4xvBzpddl0XKjfO+SNM9j1aEtAjCJlD3QXGMBAb7A++SMGssVhtx3B97ov8Lejo9tFvuM963z1B/oTBsjBvCjzzjIdCdZnlYn5QL8gmX/MQKBgFknp9MvN3EBm01ueAvTbHCgws/7dOfefafS/GogMOi44HZgeiGyWxZ1QM5rBtHLqP/JmXquhB1r9kUTXzS/ypbKoCvyLDKzTd9hhJgA+D6sJ/NE/AJkfxd/WLXksRQB6Yub9zkLvulPYqShk/sbsfvBzJPSRb9w1fWOmOZyPsufAoGBAJ1crIS4dZ+Tqk4lCd8cBeITk4ZRXnwcocq2Gif0TeMjEGuT5ine7B84VKeUI8l6Obtv7ZSlxMKsymPO6WYpk9RR2ZxjI7wClCfSFFwZ3luQGPO0T5lzfqlgBRDq/ty9qhdtQY4WTKVa7eQZ5rTi0QsY4tkS8W93euWVKEIJvngRAoGAFSBrftwycOqbflxcDqgcQQA2zk4tp0zmFqxZ02/xSKfVct4F2v0mZ916p5JSLjAY2y8qQi71YIZ34YbqT7P7Wmmw4M9QVJOb9O0zJJtSa6MSogmc27BEhIkgzBN6kDcNw3pNxWO7/6c5SyKvHMmFsETostXe12HTLjLQUAiOXUA=\n-----END PRIVATE KEY-----";
const signature = Utilities.base64Encode(
Utilities.computeRsaSha256Signature(
`${header}.${claimSet}`,
privateKey
)
);
const jwt = `${header}.${claimSet}.${signature}`;
const endpoint = 'https://auth.worksmobile.com/oauth2/v2.0/token';
const options = {
method: 'post',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
payload: {
'assertion': jwt,
'grant_type': 'urn:ietf:params:oauth:grant-type:jwt-bearer',
'client_id': "YFBnvE470S8NLSaPt5JM",
'client_secret': "PEVqZxdyNP",
'scope': 'bot,bot.read'
}
}
try {
const res = JSON.parse(UrlFetchApp.fetch(endpoint, options));
Logger.log(res)
return res;
} catch(e) {
// 例外エラー処理
Logger.log('Error(token):')
Logger.log(e)
return "";
}
}
function getNextQuestionText() {
var ss = SpreadsheetApp.getActive()
var sheet = ss.getActiveSheet();
// ヘッダ行を取得
const lastRow = sheet.getLastRow()
sheet.getRange(10, 1).setValue(lastRow);
const lastColumn = sheet.getRange(lastRow, sheet.getMaxColumns()).getNextDataCell(SpreadsheetApp.Direction.PREVIOUS).getColumn();
sheet.getRange(10, 2).setValue(lastColumn);
var headers = sheet.getRange(1,1,1,sheet.getLastColumn()).getValues()[0];
switch (headers[lastColumn]) {
case "Question1":
return "所属店舗はどちらですか?";
case "Question2":
return "あなたの名前を教えてください。";
case "Question3":
return "どのようなことでお困りでしょうか?";
}
}
function sendMessage(message) {
const accessToken = getAccessToken().access_token;
const url = 'https://www.worksapis.com/v1.0/bots/6806129/channels/412765a4-079b-9756-fc71-dfde9c49972e/messages'
if (typeof message == 'string') {
const options = {
method: 'post',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
payload: JSON.stringify({
'content': {
'type': 'text',
'text': message
}
})
}
try {
const response = UrlFetchApp.fetch(url, options);
Logger.log(response)
} catch(e) {
// 例外エラー処理
Logger.log('Error(messages):')
Logger.log(e)
}
}
}
// POSTリクエストに対する処理
function doPost(e) {
sendMessage();
// JSONをパース
if (e == null || e.postData == null || e.postData.contents == null) {
console.log("error");
return;
}
var requestJSON = e.postData.contents;
var requestObj = JSON.parse(requestJSON);
//
// 結果をスプレッドシートに追記
//
var ss = SpreadsheetApp.getActive()
var sheet = ss.getActiveSheet();
// ヘッダ行を取得
var headers = sheet.getRange(1,1,1,sheet.getLastColumn()).getValues()[0];
const questionMessage = getNextQuestionText();
sendMessage(questionMessage);
// ヘッダに対応するデータを取得
var values = [];
for (i in headers){
var header = headers[i];
var val = "";
switch(header) {
// ID を返す
case "userId":
val = requestObj.source[header];
break;
case "date":
val = new Date();
break;
// メッセージ形式を返す
case "messageType":
val = requestObj.type;
break;
case "Question1":
case "Question2":
case "Question3":
val = requestObj.content.text;
break;
// その他の場合、content の中の指定の値を返す
default:
val = requestObj.content[header];
break;
}
values.push(val);
}
// 行を追加
sheet.appendRow(values);
}
デモ動画
詳細
参考ページ
GAS(Google Application Script)に戻る