実践編:Google Workspace:GAS(App Script)で当番通知
Google Workspaceで「本日の当番は◯◯さんです」というチャット通知を1日1回 自動送信する実践プログラムを作成してみましょう。
チャットを作成
まずチャットを送信したいチャットスペースを作成します。
適当な名前を付けて作成
チャット名をクリックしてメニューを開き ➔ Webhookを管理をクリック
名前の欄に適当な名前(なんでもOK)を入力して保存をクリック
アバターは一旦無しでOKです
↓のコピーボタンをクリックしてURLをコピーします
※ウインドウの外をクリックしてウインドウを閉じれます
担当者名スプレッドシートの作成
つぎに当番名を記入したスプレッドシートを用意します。
Aの列に名前を記述します。
スクリプトの追加
さきほどのスプレッドシートを開いた状態で
拡張機能 ➔ Apps Script をクリック
↓プログラムを入力する画面が表示されます
function myFunction… の場所に↓を記述していきます
※プログラム解説は後で説明します
function sendChat(msg)
{
var url = "https://chat.googleapis.com/v1/spaces/xxxxxxxx"
var message = {'text': msg}
var options = {
'method': 'POST',
'headers': {
'Content-Type': 'application/json; charset=UTF-8'
},
'payload':JSON.stringify(message)
};
UrlFetchApp.fetch(url, options);
}
function myFunction() {
const mySheet = SpreadsheetApp.getActiveSheet()
const lastRow = mySheet.getDataRange().getLastRow()
const values = mySheet.getDataRange().getValues()
const toDay = new Date();
for(let i=0; i < lastRow; i++)
{
const name = values[i][0]
const date = values[i][1]
if(!date ||
date.getFullYear() != toDay.getFullYear() ||
date.getMonth() != toDay.getMonth() ||
date.getDate() != toDay.getDate()
)
{
sendChat(`今日の当番は${name}です`)
mySheet.getRange(i+1,2).setValue(toDay)
break
}
}
}
↓ url をさきほどのチャット作成画面でコピーした urlを貼り付けます
準備ができたので ↓保存、myFunction、実行の順にクリックします
初回は↓のポップアップが表示されます
↓内容をよく読んでから問題なければ「許可」をクリックします
正常に実行できた時のログ
チャットにメッセージが届きます
※Webhookで設定した名前「スクリプトから送信」が表示されています。
アバターのURLを設定すれば↓のアイコンが設定できます
スプレッドシートの「鈴木太郎」の横には実行日時が記録されます
自動実行タイマーの設定
↓さきほどの Apps Script の左の時計アイコン(トリガー)をクリック
右下の「トリガーを追加」
実行する関数を選択
myFunction実行するデプロイを選択
そのままHeadイベントのソースを選択
時間手動型時間ベースのトリガーのタイプを選択
日付ベースのタイマー時刻を選択
通知を受け取りたい時間を設定
これでプログラムが自動で実行されるようになります。
完成!
Apps Script解説
プログラムは myFunction から最初に実行されます
function myFunction() {
const mySheet = SpreadsheetApp.getActiveSheet()
const lastRow = mySheet.getDataRange().getLastRow()
const values = mySheet.getDataRange().getValues()
const toDay = new Date();
取得、宣言したデータ
mySheet
このスプレッドシートを取得していますlastRow
このスプレッドシートの最後の行数を取得していますvalues
このスプレッドシートの全データを取得しています
toDay
今日の日付を取得しています
それぞれ log を見てみましょう
console.log(mySheet.getName())
console.log(lastRow)
console.log(values)
[ [ '鈴木太郎',
Mon Feb 06 2023 14:32:34 GMT+0900 (Japan Standard Time) ],
[ '山田花子', '' ],
[ '田中次郎', '' ],
[ '中村梅', '' ] ]
↑2次元配列で当番名と実行日付が入っています
console.log(toDay)
当番を割り出す処理
for(let i=0; i < lastRow; i++)
{
const name = values[i][0]
const date = values[i][1]
if(!date ||
date.getFullYear() != toDay.getFullYear() ||
date.getMonth() != toDay.getMonth() ||
date.getDate() != toDay.getDate()
)
{
sendChat(`今日の当番は${name}です`)
mySheet.getRange(i+1,2).setValue(toDay)
break
}
}
for(let i=0; i < lastRow; i++)
最後の行までループconst name = values[i][0]
スプレッドシート A列を i 行ごとに順番に取得const date = values[i][1]
スプレッドシート B列を i 行ごとに順番に取得if(!date ||
B列が何も無い時、もしくは=or=||date.getFullYear() != toDay.getFullYear() ||
今年ではない時、もしくは=or=||date.getMonth() != toDay.getMonth() ||
今月ではない時、もしくは=or=||date.getDate() != toDay.getDate()
今日ではない時sendChat(`今日の当番は${name}です`)
チャットを送信しますmySheet.getRange(i+1,2).setValue(toDay)
送信した担当者のスプレッドシートの行に本日の日付を保存break
ループ終了
sendChat 関数
チャット送信処理の中身はこういう風に書くとチャットが送信されるとくらいで憶えておいても大丈夫です。
まとめ
スプレッドシートの内容やプログラムの中身、自動実行の間隔を変更して工夫すればアイディアの限り便利なツールが作れるはずです!
いろいろ試してみてください!
お詫び
myFunctionで行っている担当者を決定するプログラムに不具合がありました。次の記事で解説しています。ごめんなさい。
この記事が気に入ったらサポートをしてみませんか?