Googleフォームで簡易日報&工数管理システムを組む

電脳備忘録

Goolgeフォームを使って日々の工数管理を行いたいから作ってと依頼され、先人の知恵を借りまくってGASでなんとか実装しました。HTMLコーダーにプログラミングを任せてはいけない(戒め)。

要求仕様

  • フォームの内容をメール送信したい。
  • メールの送信先はメンバー別に設定したい。
  • 入力した項目のみメールに反映させたい。
  • チーム内の若手のみ目標管理させたい。
  • 工数の合計値を算出してメールに記載したい。
  • 送信元は入力した本人、もしくはシステムからとしたい。

要求仕様を満たしつつ、動作としてはメンバーの一覧から自分の名前を選択(ラジオボタン)し、選択内容によってメール送信先を分けるようにした。

コード

結論から言うとこうなった。

function sendFormMail(e){
var timeStamp=e.namedValues["タイムスタンプ"];
//日付の取得
var now   = new Date();
var year  = now.getFullYear(); //年
var month = now.getMonth()+1;    //月
var day   = now.getDate();     //日
var name=e.namedValues["記入者"];
var job_a =Number(e.namedValues["作業A(H)"]);
var job_b =Number(e.namedValues["作業B(H)"]);
var progress_report =e.namedValues["【進捗報告】"];
var consultation =e.namedValues["【所感・相談】"];
//本日の工数を入れる処理
var active_ss = '********************'; //スプレッドシートのIDを指定
var active_sh_name ='シート'; //スプレッドシートのシート名を指定
var ss = SpreadsheetApp.openById(active_ss).getSheetByName(active_sh_name);
var last_row = ss.getLastRow(); //最終行の番号を取得
//本日の工数集計
var today =job_a+job_b
//最終行に本日の工数合計を入れる
ss.getRange(last_row, 27).setValue(today);
var subject = "【日報】"+year+"年"+month+"月"+day+"日_"+name;
var body="お疲れ様です"+name+"です。"+"\n";
body+="日報をお送り致します。"+"\n\n";
if(name=="鷺沢") {
var ss_id = 'シートID'; //スプレッドシートのIDを指定
var sh_name ='シート名'; //スプレッドシートのシート名を指定
var sh = SpreadsheetApp.openById(ss_id).getSheetByName(sh_name);
var short_term_goal = sh.getRange('A2').getValue();
var long_term_goal = sh.getRange('A5').getValue();
body+="【今週の目標】\n"+short_term_goal+"\n\n";
body+="【今年の目標】\n"+long_term_goal+"\n\n";
}
body+="【本日の業務内容】"+"\n";
try{
// スプレッドシートの操作
var sh   = SpreadsheetApp.getActiveSheet();
var rows = sh.getLastRow();
var cols = sh.getLastColumn();
var rg   = sh.getDataRange();
Logger.log("rows="+rows+" cols="+cols);
for (var j = 1; j <= cols; j++ ) {
var col_name  = rg.getCell(1, j).getValue();    // カラム名
var col_value = rg.getCell(rows, j).getValue(); // 入力値
//値がnullの場合はメールに記載しない。
if(col_value == "") { continue;}
if ( col_name === "作業A" ) {
body+="作業A:"+job_a+"H\n";
}
if ( col_name === "作業B" ) {
body+="作業B:"+job_b+"H\n";
}
if ( col_name === "【進捗報告】" ) {
body+="\n【進捗報告】\n"+progress_report+"\n";
}
if ( col_name === "【所感・相談】" ) {
body+="\n【所感・相談】\n"+consultation+"\n";
}
}//for
}catch(e){
}//try
body+="\n\n"+"以上です。"+"\n"+"よろしくお願いいたします。"+"\n\n";
body+= name;
//メール送信設定
if(name=="鷺沢") {
var address = ['aaa@example.com', 'bbb@example.com', 'ccc@example.com'];
MailApp.sendEmail(address,subject,body, {noReply: true});
} else if(name=="三村"){
var address = ['aaa@example.com','ccc@example.com', 'ddd@example.com'];
MailApp.sendEmail(address,subject,body, {noReply: true});
} else {
//上記以外のメンバーはメール送信しない。
}
}//sendFormMail

時間は数値化して格納

 var name=e.namedValues["記入者"];
var job_a =Number(e.namedValues["作業A(H)"]);
var job_b =Number(e.namedValues["作業B(H)"]);
var progress_report =e.namedValues["【進捗報告】"];
var consultation =e.namedValues["【所感・相談】"];

登録情報は最終行に追記されるという前提のもと、指定したスプレッドシートのセルに合計を入れる。

 //本日の工数を入れる処理
var active_ss = '********************'; //スプレッドシートのIDを指定
var active_sh_name ='シート'; //スプレッドシートのシート名を指定
var ss = SpreadsheetApp.openById(active_ss).getSheetByName(active_sh_name);
var last_row = ss.getLastRow(); //最終行の番号を取得
//本日の工数集計
var today =job_a+job_b
//最終行に本日の工数合計を入れる
ss.getRange(last_row, 27).setValue(today);

新人社員の鷺沢さんの場合は指定されたスプレッドシートに記載された目標をメールに記載する。

 if(name=="鷺沢") {
var ss_id = 'シートID'; //スプレッドシートのIDを指定
var sh_name ='シート名'; //スプレッドシートのシート名を指定
var sh = SpreadsheetApp.openById(ss_id).getSheetByName(sh_name);
var short_term_goal = sh.getRange('A2').getValue();
var long_term_goal = sh.getRange('A5').getValue();
body+="【今週の目標】\n"+short_term_goal+"\n\n";
body+="【今年の目標】\n"+long_term_goal+"\n\n";
}

フォームの内容をスプレッドシートに登録する。セルが空白の場合いはメールに記載しない。


body+="【本日の業務内容】"+"\n";
try{
// スプレッドシートの操作
var sh   = SpreadsheetApp.getActiveSheet();
var rows = sh.getLastRow();
var cols = sh.getLastColumn();
var rg   = sh.getDataRange();
Logger.log("rows="+rows+" cols="+cols);
for (var j = 1; j <= cols; j++ ) {
var col_name  = rg.getCell(1, j).getValue();    // カラム名
var col_value = rg.getCell(rows, j).getValue(); // 入力値
//値がnullの場合はメールに記載しない。
if(col_value == "") { continue;}
if ( col_name === "作業A" ) {
body+="作業A:"+job_a+"H\n";
}
if ( col_name === "作業B" ) {
body+="作業B:"+job_b+"H\n";
}
if ( col_name === "【進捗報告】" ) {
body+="\n【進捗報告】\n"+progress_report+"\n";
}
if ( col_name === "【所感・相談】" ) {
body+="\n【所感・相談】\n"+consultation+"\n";
}
}//for
}catch(e){
}//try

新人の鷺沢さんと中堅の三村さんでメールの送信先を分ける。
メールの送信元は「noReply」とする。

 //メール送信設定
if(name=="鷺沢") {
var address = ['aaa@example.com', 'bbb@example.com', 'ccc@example.com'];
MailApp.sendEmail(address,subject,body, {noReply: true});
} else if(name=="三村"){
var address = ['aaa@example.com','ccc@example.com', 'ddd@example.com'];
MailApp.sendEmail(address,subject,body, {noReply: true});
} else {
//上記以外のメンバーはメール送信しない。
}

広告

ブログの維持費に充てるでございます・・・。