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. 以下シリアル値の末値が1日のうちで変わる(変わる)のは何故か?
    var today =  Math.floor(new Date().getTime()/1000/24/60/60);
  2. googleSpreadsheet filterの操作
    SpreadsheetのフィルタをScriptでON/OFFするには?
  3. google apps scriptはタイムアウトがあるので要処理時間短縮

参考サイト

おすすめ