Google Apps Script で当日タスクの抽出とメール配信
最近タスク管理にgoogleDriveを利用している。
今まで、MicrosoftProjectなども試したがあまり実用的とも言えなかった。
昨今の脱ウォーターフロー開発モデルからアジャイル開発・・・などでは無いが、
所詮現場は何時でも混乱している。
必要な手法はプロジェクトの計画立案、実施、検証であるが、作業実施時に混乱したタスクとスケジュールの追跡は大変だ。
せめて、連絡だけはスムーズに行いたい。
実際googleDriveは共有環境構築も最も効率良く出来ている。
Google Apps Scriptを利用すれば、全てのgoogleサービスを自由に(効率良く)?操ることが可能だ。
プログラマでは無い私には無理だが、今回少しでもスタッフの手助けになればと、googleSpreadsheetに構築しているタスクシートから当日タスクを抜き出して、別シートにコピーし、メール送信するプログラムを組んでみた。
ループ内で直接getRangeなどしているために非常に処理は遅いが、夜中にトリガーを使って動かせばよいので、ここまで。
先ずは自身のために覚書です。
PS.しかし、googleはやってくれる。Javascriptをここまでフィーチャーしてくれるとは。
こんなに使えるサーバーサイドJavascript、勉強するなら今でしょ。
function copyTodaysTask(){
/*sheet1の期限に本日があればsheet2へコピーする。*/
var sheetName ="シート名";
var colrow = "A:H";
var outputSheet1 = "today";
var row=1;//行詰めでセットするためのカウンタ
var limitDay;
var deadlineCol = 7; //終了日のある列
var today = Math.floor(new Date().getTime()/1000/24/60/60)-1;
var resource =5;
var exceptions =["除外1","除外2"];
var ss = SpreadsheetApp.openById(SpreadsheetApp.getActiveSpreadsheet().getId());
var sheet1 = ss.getSheetByName(sheetName);
var sheet2 = ss.getSheetByName(outputSheet1);
var lastRow =sheet1.getLastRow();
var resourceCheck ;
//clear sheet
sheet2.clear();
//最終行までループ
for (var i=1 ; i <= lastRow; i++){
limitDay=Math.floor(sheet1.getRange(i,deadlineCol).getValue()/1000/24/60/60);
esourceCheck=sheet1.getRange(i,resource).getValue();
if (limitDay == today){
if (exceptions.indexOf(resourceCheck)== -1 ){
for (var ii = 1; ii <= 8; ii++){
sheet2.getRange(row,ii).setValue(sheet1.getRange(i,ii).getValue());
}
}else{
row--;
}
row++;
}
}
}
function mail(){
var outputSheet1 = "today";
var ss = SpreadsheetApp.openById(SpreadsheetApp.getActiveSpreadsheet().getId());
var sheet2 = ss.getSheetByName(outputSheet1);
var cell = sheet2.getRange('A1');
var today = Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyy/MM/dd");
// offset計算のため値を1減算
var ticketName = 2;
var period = 6;
var worker = 4;
//送信先
var mailAdress = "hoge@gmail.com"; // カンマ区切りで複数アドレス指定可
var message="------------------------------------------------\n";
if (lastRow==0){
message+="本日の作業はありません。\n"
}else{
for (var i=1 ; i <= lastRow; i++){
message+=cell.offset(i-1,0).getValue()+":"+ "作業者:"+cell.offset(i-1,worker).getValue()+ "チケット名:"+cell.offset(i-1,ticketName).getValue()+"\n";
}
}
message+="------------------------------------------------\n";
message+="Have a nice day!\n";
MailApp.sendEmail(mailAdress, "件名", message);
}
疑問点
- 以下シリアル値の末値が1日のうちで変わる(変わる)のは何故か?
var today = Math.floor(new Date().getTime()/1000/24/60/60); - googleSpreadsheet filterの操作
SpreadsheetのフィルタをScriptでON/OFFするには? - google apps scriptはタイムアウトがあるので要処理時間短縮
参考サイト
- http://engineer-intern.jp/archives/6547
ちょっとプログラミング基礎な部分が必要無い方は基礎を飛ばして、Google Apps Scriptの概要確認にはGOOD! - http://news.mynavi.jp/series/apps_script/001/index.html
こちらもGOOD!