Jamyy's Weblog

BASH: 早班提醒

by Jamyy on 九月.05, 2016, under Coding

基於 Google Apps Script: 早班提醒 所編輯的 Google 試算表, 改由 Linux shell script (BASH) 進行通知與提醒

重點

  • 以 curl / wget 將 Google 試算表下載為 CSV 檔案
  • 利用 gcalcli 於 Google 日曆新增例行工作提醒
  • 在 BASH 將空白分隔的字串轉成陣列
  • crontab 排程 "每月月底執行" 的方法

環境: CentOS 6

前置作業:

  1. 登入 Google Drive, 編輯輪值表
  2. 新增工作表, 將空白的新工作表位置拉到最左邊
  3. 將本月與次月班表內容複製到新工作表, 此為下載 CSV 檔案時的內容
  4. 共用試算表, 開啟連結共用設定, 取得共用連結, 以供 Shell Script 下載班表
  5. 登入 Google 日曆, 創建新日曆 -- 每人一個日曆名稱, 讓同仁個別訂閱, 用以提醒例行工作



編輯文字檔: 排班人員通知設定
$ vi ~/morning-shift.rcpt

姓名 空格 電子郵件 空格 日曆名稱
○○○ ooo@gmail.com notify-ooo
ΧΧΧ xxx@gmail.com notify-xxx

編輯程式化腳本: 下載 Google 試算表為 CSV 檔案 (取得/更新班表資料)
$ vi ~/bin/morning-shift-update && chmod +x $_

#!/bin/bash

# 原共用連結格式: https://docs.google.com/spreadsheets/d/LONG_ID_STRING/edit?usp=sharing
# 改成: https://docs.google.com/spreadsheets/d/LONG_ID_STRING/export?format=csv&id=LONG_ID_STRING
# 即可用 curl / wget 指令將 Google 試算表下載為 CSV 檔案

TMPFILE=/tmp/spreadsheet.csv
OKFILE=~/morning-shift.csv

curl --silent "https://docs.google.com/spreadsheets/d/LONG_ID_STRING/export?format=csv&id=LONG_ID_STRING" > $TMPFILE
awk -F, '{print $1,$2,$3,$4}' $TMPFILE > $OKFILE
awk -F, '{print $6,$7,$8,$9}' $TMPFILE >> $OKFILE

編輯程式化腳本: e-mail 通知明天早班人員, 安排例行工作提醒於 Google 日曆
$ vi ~/bin/morning-shift-notify && chmod +x $_

#!/bin/bash

function adding_calendar_event {
	source /opt/rh/python27/enable
	gcalcli --calendar "$1" \
	        --title '早班人員例行工作' \
	        --where '' \
	        --when "$(date --date 'tomorrow 8:30')" \
	        --duration 10 \
	        --description '' \
	        --reminder 3 \
	        add
	gcalcli --calendar "$1" \
	        --title '早班人員例行工作' \
	        --where '' \
	        --when "$(date --date 'tomorrow 15:30')" \
	        --duration 10 \
	        --description '' \
	        --reminder 3 \
	        add
}

FILE1=~/morning-shift.csv
FILE2=~/morning-shift.rcpt
TOMORROW=$(date --date 'tomorrow' '+%Y-%m-%d')
TOMORROW_MONTH=$(echo $TOMORROW | cut -d\- -f2 | sed 's/^0//')
TOMORROW_DAY=$(echo $TOMORROW | cut -d\- -f3 | sed 's/^0//')

DUTY=$(grep "${TOMORROW_MONTH}月${TOMORROW_DAY}日" $FILE1)
if [ -n "$DUTY" ]; then
	ARY_DUTY=($DUTY)
	WEEKDAY=${ARY_DUTY[1]}
	NAME=${ARY_DUTY[2]}
	RCPT=$(grep "^$NAME" $FILE2)
	if [ -n "$NAME" ] && [ -n "$RCPT" ]; then
		ARY_RCPT=($RCPT)
		EMAIL=${ARY_RCPT[1]}
		CALENDAR=${ARY_RCPT[2]}
		adding_calendar_event "$CALENDAR"
		echo "明天 $TOMORROW ($WEEKDAY) 早班" | mail -s "早班提醒" $EMAIL
	fi
fi

排程: 每日 19:20 通知隔天早班人員, 每月倒數第二天自動更新 CSV 檔案
$ crontab -e

20 19 * * * ~/bin/morning-shift-notify
18 19 27-30 * * [ $(date --date '+2 days' '+%d') -eq 1 ] && ~/bin/morning-shift-update



Ref:



: