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

電脳備忘録

本記事のソースコードの利用によって生じた損害について、当方は一切の責任を負いません。ご自身の判断と責任のもとで参照・ご利用ください。

この記事は最終更新から3年以上経過しています。

 

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 {
      //上記以外のメンバーはメール送信しない。
    }
0%