見出し画像

実践編: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を貼り付けます

var url = "https://chat.googleapis.com/v1/spaces/xxxxxxxx"

準備ができたので ↓保存、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())

シート1

getNameでシート名を表示

console.log(lastRow)

4

4行あることがわかります

console.log(values)

[ [ '鈴木太郎',
    Mon Feb 06 2023 14:32:34 GMT+0900 (Japan Standard Time) ],
  [ '山田花子', '' ],
  [ '田中次郎', '' ],
  [ '中村梅', '' ] ]

↑2次元配列で当番名と実行日付が入っています

console.log(toDay)

Mon Feb 06 2023 14:48:10 GMT+0900 (Japan Standard Time)

日付オブジェクト(本日)

当番を割り出す処理

  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で行っている担当者を決定するプログラムに不具合がありました。次の記事で解説しています。ごめんなさい。


この記事が気に入ったらサポートをしてみませんか?