この記事は「鹿児島.mk #7 Google Apps Scriptのハンズオン」で使用する資料です。あらかじめご了承ください。
鹿児島.mk #7 Google Apps Scriptのハンズオン
https://kagoshima-mk.connpass.com/event/167038/
概要
Google Apps Scriptとは
Googleが提供しているJavaScriptをベースにするプログラミング言語です。ブラウザ上で実行でき、GoogleスプレッドシートやGoogleフォームと連携することで、特定の条件で自動的に処理(スプレッドシートに更新があったら通知, フォームに入力があれば自動でLINEを送る等)を実行することができます。
Google Apps Script
https://developers.google.com/apps-script
GASでできること
Googleアカウントに関することなら何でもできる!
- Gmailを送る
- Gmailの内容を取得する
- Googleカレンダーに予定を登録・編集する
- Googleスプレッドシートの編集
- Jobを実行する
- APIを叩いたり、APIを作る
つよつよなVBA!!
今回すること
- Googleフォームに入力があったときにSlackに通知する
- herokuを常時起動させる
- WebAPIを作る
- DB+WebAPIを作る
- 外部APIから情報を取得してスプレッドシートに記録する
Googleフォームに入力があったときにSlackに通知する
Googleフォームの作成
以下と同じフォームを作成してください
フォームはこちらから作成できます。
https://docs.google.com/forms/u/0/
サンプルコードの準備
webhookのURLはこちらで配布します
https://join.slack.com/t/kagoshima-mk/shared_invite/enQtNzMxNzc3NTQ4NDM5LTI4NGU3NjQzYjZjNjI3MDU3MWU2YmMxNGJjNzU0N2NkOTg3MGJhZGZjZDUwYTkzMGRmMGQ1ZDNiNTVlYmNmNTQ
自分でWebhook URLを取得したい方はこちらを参考にしてください
SlackのWebhook URL取得手順
https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008
var postChannel = "{チャンネル名}";
var url = "{webhook}";
// 好きな名前で大丈夫です
var userName = "{参加者名}";
function sendToSlack(body) {
var data = { "channel" : postChannel, "username" : userName, "text" : body, "icon_emoji" : ":sushi:" };
var payload = JSON.stringify(data);
var options = {
"method" : "POST",
"contentType" : "application/json",
"payload" : payload
};
var response = UrlFetchApp.fetch(url, options);
}
function test() {
FormApp.getActiveForm();
sendToSlack("テスト通知確認です");
}
function onFormSubmit(e){
var body = "==============================";
var applicant = "";
var itemResponse = e.response ? e.response.getItemResponses(): [];
var email = e.response ? e.response.getRespondentEmail(): 'test@hoge.com';
var name = '名無し';
var jobs = '無職';
var age = '無回答';
for (var j = 0; j < itemResponse.length; j++){
var formData = itemResponse[j];
var title = formData.getItem().getTitle();
var response = formData.getResponse();
switch (title) {
case "メールアドレス":
email = response;
break;
case "お名前":
name = response;
break;
case "所属":
jobs = response;
break;
case "年齢":
age = response;
break;
default:
break;
}
}
var text = body + " \nお名前:" + name + "\nメールアドレス: " + email + "\n職業:" + jobs + "\n年齢" + age + "\n\n==============================";
sendToSlack(text);
}
課題
- フォームに項目を追加して、その項目と入力内容がSlackに通知されるようにしてください。
- Slackに投稿されるアイコンを寿司から別のものに変更してください(アイコンはicon_emojiで設定できます)
Qiita/Github/Slack/Discord 絵文字一覧
https://qiita.com/yamadashy/items/ae673f2bae8f1525b6af
(CI/CDチームはここまで)
先に進んだ人用
herokuを常時起動させる
【3分でできる】Herokuの無料プランでもスリープせずに高速化する方法【アドオン不要】
https://qiita.com/qst_exe/items/9770cadef420c04e1a84
WebAPIを作る
今から10分ではじめる Google Apps Script(GAS) で Web API公開
https://qiita.com/riversun/items/c924cfe70e16ee3fe3ba
DB+WebAPIを作る
Gasでgoogle Spreadsheetをjsonで返す方法
https://qiita.com/taichi0514/items/ee6dedff45f9d9e58ef4
外部APIから情報を取得してスプレッドシートに記録する
使用するスプレッドシート
https://docs.google.com/spreadsheets/d/13SuzxIuF6hw0vkteeTgpLFBGxpuX56rmRqmn3-IsY4E
var ssId = '{スプレッドシートのID}';
var dbSheetName = '{DBとして使うシート名}';
//JSONのURL
var jsonUrl = "{APIのURL}";
var inputSheetName = "{データを書き込むシート名}";
// 以下の項目は編集しない
var spUrl = "https://docs.google.com/spreadsheets/d/"+ssId+"/";
var spreadsheet = SpreadsheetApp.openByUrl(spUrl);
var keys = {
'title' : "",
'started_at': "",
'event_url' : "",
};
function onOpen() {
var ui = SpreadsheetApp.getUi();
var menu = ui.createMenu('メニュー');
menu.addItem('APIからJSON取得', 'getJson');
menu.addToUi();
}
function getData(id, sheetName) {
var sheet = SpreadsheetApp.openById(id).getSheetByName(sheetName);
var rows = sheet.getDataRange().getValues();
var keys = rows.splice(0, 1)[0];
return rows.map(function(row) {
var obj = {}
row.map(function(item, index) {
obj[keys[index]] = item;
});
return obj;
});
}
function doGet(e) {
var func = 'items';
var data = getData(ssId, dbSheetName);
return ContentService.createTextOutput(func + '(' + JSON.stringify(data, null, 2) + ')')
.setMimeType(ContentService.MimeType.JAVASCRIPT);
}
function getJson() {
var sheet = spreadsheet.getSheetByName(inputSheetName);
var json = UrlFetchApp.fetch(jsonUrl).getContentText();
var jsonData = JSON.parse(json);
var eventData = jsonData.events;
var k = 1;
for(var key in keys) {
sheet.getRange(1, k).setValue(key);
k++;
}
var i=2;
for (var idx in eventData) {
var j=1;
for(var key in keys) {
var type = typeof eventData[idx][key];
sheet.getRange(i, j).setValue(eventData[idx][key]);
j++;
}
i++;
}
}