諸事情により私のいる部署が本社から置いだされました。
まあそれは良いとして、顔認証つき体温計測記録がつかえなくなり、
出社する度に共有フォルダのEXCELファイルに記録しなくてはならなくなりました。
これがめんどくさい上に、よく忘れる。Bossも全然記入してないし…
ということで、GASの勉強がてらサクッと作りました。
Index
- 設計
- GoogleSheetの準備
- GoogleFormの準備
- Google App Scriptの作成
- デプロイ
- おまけ Slackへの通知
設計
①GoogleFormで名前を選択リストから選択、体温を入力し送信
②GoogleSpreadSheetに記録される
③おまけとして体温を37度以上でFormを送信するとSlackへ通知
という上記3点を満たすシンプルなものを作成します。
では早速行ってみましょう。
GoogleSheetの準備
まずはGoogleSpreadSheetを作成します。
A列にIDとB列名前、一行目に日付を「MM/dd」の形式で入力します。
一枚目のシートができたら、Sheetをコピーして翌月、翌々月...と必要な分だけ作成します。
作成が完了したら、SpreadSheetIDを取得し、メモしておきましょう。
IDは、スプレッドシートのURLから確認できます。
例えば、URLが以下のようであれば、
URL(ダミー):https://docs.google.com/spreadsheets/d/1Hqp2IvxXrCGee_w9Gvbe4nXXXXXjrIMxXXXXXXX/edit#gid=597941997
d/と/editの間の「1Hqp2IvxXrCGee_w9Gvbe4nXXXXXjrIMxXXXXXXX」がスプレッドシートIDになります。
引用:【gas】googleスプレッドシートidの見方)
GoogleFormの準備
続いて、GoogleFormを作成します。
今回は、SpreadSheetに記入した名前の選択リストと体温を記入するテキストボックスのみ作成します。
右側のプラスボタンから質問を追加し、それぞれ設定します。
非常に簡単に作成できて便利ですよね。
Google App Scriptの作成
さて準備が整いましたので、ここでついにGASを記述していきます。
先ほど作成したFormの右上点3つからスクリプトエディタを開きます。
Formからスクリプトエディタを開くことにより、そのFormに紐づいたスクリプトが書けます。
まずは、Formの回答を取得し、その値を次に呼び出す関数に渡してあげるコードを書いていきます。
const getFormValues = e =>{
FormApp.getActiveForm();
var itemResponses = e.response.getItemResponses();
var user = itemResponses[0].getResponse();
var temp = itemResponses[1].getResponse();
recordTemperature(user,temp);
}
関数getFormValuesの引数である(e)にformの回答が格納されています。
Fromの質問に対し上から順に、0,1,2,3...と対応付けされています。
今回は2つ質問を用意したので、0と1を指定しています。
続いて、先ほどのrecordTemperature(user,temp)の中身を書いていきます。
その前に日付を先に用意しておきましょう。
const date = new Date();
//今月(4月なら"04")
const formatMonth = Utilities.formatDate(date, "JST","MM");
//今日(4月30日なら04/30)
const formatToday = Utilities.formatDate(date, "JST","MM/dd");
ここで先ほど控えていた、GoogleSheetのIDが必要になります。
コード内3行目SpreadsheetApp.openById()にて使用します。
const recordTemperature=(userName,temperature)=>{
//対象のSpreadSheet及びシートを選択
const spreadSheet = SpreadsheetApp.openById("1Hqp2IvxXrCGee_w9Gvbe4nXXXXXjrIMxXXXXXXX").getSheetByName(formatMonth);
//最終列を取得
const lastRow = spreadSheet.getLastRow();
//最終行を取得
const lastCol = spreadSheet.getLastColumn();
//名前を上から順に一致するとこまでループ
for(var i=2; i <= lastRow; i++){
let nameValue = spreadSheet.getRange(i,2).getValue();
if(userName == nameValue){
//名前が一致したら、今度は日付をループ
for (var l = 3; l <= lastCol; l++){
let dateValue = spreadSheet.getRange(1,l).getValue();
let formatDateValue = Utilities.formatDate(dateValue,"JST","MM/dd");
if(formatToday == formatDateValue){
//日付も一致したら、その行と列の交わるセルに値を入力する
spreadSheet.getRange(i,l).setValue(temperature);
}
}
}
}
}
デプロイ
ここまで終えたら、一旦デプロイしましょう。
①右上のデプロイボタンをクリック
②「新しいデプロイ」を選択
③ひとまず権限は「自分のみ」のままデプロイします。
次にトリガーを選択します。
①左側のナビゲーションからトリガー(目ざまし時計アイコン)を開きます。
②右下の「トリガーを追加をクリック」
③実行する関数は 「getFormValues」
実行するデプロイは「version1」
イベントのソース は「フォームから」
イベントの種類を「起動時」
④保存をクリック
次にGoogleFormに戻り、実際に動かしてみます。
①右上の送信をクリック
②送信方法タブの真ん中を選択
③リンクをコピーしてアクセス
④フォームに入力して送信をクリック
最後に、スクリプトエディタに戻り、実行状況を確認しましょう。
①左側のナビゲーションから「実行数」を開きます。
②ステータスが「完了」になっていればOKです。
③シートも確認しましょう。フォームから送信した内容と相違なければOKです。
おまけ Slackへの通知
ここからは少しレベルを上げて、slackへAPIを使用して、メッセージを送信します。
slackのWebAPIの使用方法については、下記の記事をご参照ください。
https://qiita.com/kshibata101/items/0e13c420080a993c5d16
今回は、体温が37度以上あった場合、Slackの任意のチャンネルへメッセージを投げる処理を追加します。
const getFormValues = e =>{
//前述の関数の中に下記を追記します。
//Formの名前と体温を使って文章を作成し、それを引数に関数を呼びます。
if(temp >= 37.0){
const text = "Hi, " + user + " have a fever of " + temp + " degrees!!";
alertSlack(text);
};
const alertSlack = text =>{
var webHookUrl = "Slackの設定で取得したURL";
var jsonData =
{
"channel": "#チャンネル名", // 通知したいチャンネル
"text" : text //通知内容
};
var payload = JSON.stringify(jsonData);
var options =
{
"method" : "post",
"contentType" : "application/json",
"payload" : payload,
};
// リクエスト
UrlFetchApp.fetch(webHookUrl, options);
};
SlackのAPIを使用する際にはまった点
今回書かせていただいた内容は、人と日付の合致するセルに値をセットするという汎用性の高いであろうものです。
目的である体温管理記録表以外の用途へも応用していきたいと思います。
またAPIもこれだけ簡単に使えるのであれば、これをベースにいろいろ試していければと思います。
以上です。