かずきち。の日記

サーバサイドエンジニアのつぶやき

業務集計の上司報告プログラムを作成して、完全自動化をした話

f:id:kazukichi_0914:20211020155629g:plain

作ったきっかけ

毎週会社で何かしら報告する場面があります。
でも人手で集計して、同じ作業を繰り返すのはイマイチ効率の悪さを感じます。
というより、もはや自動化以外にあり得ないなと…
なので、報告系の業務をいっその事自動化してしまいましょうと思い立って、数時間ほど作業をしてすぐ完成しました。
逆に今までやっていた人手の作業はなんだったんだという…
それか自分のスキルが上がったのか…

//プログラムの二次利用にあたって

//利用権限設定のお願い
//本プログラムはGASに対するカレンダーへの書き込み権限・Gmailの送信権限(左サイドバーのサービスからGmailとCalendarの利用をオンにしてください)を利用します。
//実行時のスクリプトへの実行権限を許可してください。

//おすすめの設定
//GASのコードは自動実行(金曜日定時間際)が可能です。
//左サイドバー「時計マーク→時計マーク」から本プログラムの実行条件を設定ができます。
//毎週金曜日終業間際に今週のタスク処理件数を自動集計して、指定のメールアドレスに送信しています。
//54行目のメールアドレスの設定先・59行目がメール本文になります。

//このプログラムを稼働させる条件
//このプログラムが行っていることは、毎週ポータルから割り当たるタスクを自動集計してしますが、Gmailラベル「@@@」というラベルの付いたGmailを自動集計します。
//2次利用される方はGmailApp.searchスレッドの検索条件を変更してください。

//※重要 日本のタイムゾーンの設定
//本プログラムは毎週のタスクの自動集計を目的としますが、Googleのプログラムは初期設定でアメリカ時間での実行をデフォルトとします。
//ですので、送信時刻を取り扱う・今週の予定を集計する場合はformatDateがJSTであることを確認してください。
//Googleカレンダー歯車マーク→カレンダーのタイムゾーンの設定JSTを設定してください。

//プログラムの実行上限
//xxx社のGoogleアカウントはGoogleWorkplaceの条件が適用されます。
//https://developers.google.com/apps-script/guides/services/quotas?hl=ja#current_limitations
//上記URLの上限をオーバーした場合、数時間~1日のGoogleサービス利用停止措置がGoogleによって取られ、Googleサービスの利用が制限されます

//以下、プログラム本体

function getUserLabelsSample() {
  //日付けオブジェクトを作る
  var date = new Date();
 
  //スプレッドシートのkeyを指定して取得(スプレッドシートURL末尾のID)
  var spreadsheet = SpreadsheetApp.openById('スプレッドシート 末尾IDに置き換える');

  const start = 0;
  const max = 100;
 
  var date = new Date(); //現在日時のDateオブジェクトを作る
  var today = Utilities.formatDate(date, 'JST', 'yyyy/MM/dd');
  Logger.log(today); //2019/09/05
 
  //現在の「日」を取得
  var day = date.getDate();
  //Logger.log(day); //5
 
  //前日日付にしたいので-1する
  date.setDate(day-7);
  //Logger.log(date); //Wed Sep 04 19:33:33 GMT+09:00 2019
  var startday = date;
 
  //日付の表示形式を整形する
  var lastweek = Utilities.formatDate(startday, 'JST', 'yyyy/MM/dd');
  //Logger.log(lastweek); //2021/06/14
 
  const threads = GmailApp.search("label:@@@ after:"+lastweek);
  const messagesForThreads = GmailApp.getMessagesForThreads(threads);
  Logger.log("新しいタスク件数"+messagesForThreads.length);
 
  var title3 = ""
  
  for(const messages of messagesForThreads){
    //Logger.log(messages[0].getSubject());
    var title1 = messages[0].getSubject().replace("新しいタスク","")
    var title2 = title1.replace(" があなたに割り振られました!","")
    var title3 = title3.concat("\n"+title2);
    Logger.log(title3);
  }
 
   const recipient = 'xxx@xxx.co.jp'; //送信先のメールアドレス
   const subject = '今週の処理件数';

  const recipientName = 'xxx';
  const body = '本メールは今週分のポータルの自割り当てのタスク件数を自動集計しています。\n割り当てタスクの内容は下記カレンダーURLのメモ欄に記入してあります。\n\n'+messagesForThreads.length+'件\n\nhttps://calendar.google.com/calendar/u/0?cid=123456789';
 
  GmailApp.sendEmail(recipient,subject,body);
  
  //createAllDatEvent で終日イベントを登録
  CalendarApp.getDefaultCalendar().createAllDayEvent("今週のポータル割り当て数"+messagesForThreads.length+"件",new Date(today),{description:title3})  

  //例
  /*
'xxx権限IDの貸出しの設定をお願いします'
 'yyy利用申請'
 'zzzサイトの閲覧制限解除作業 または eeeダウンロード作業のお願い'
 'aaaの変更依頼'
 'aaaの変更依頼'
 'yyy利用申請'
 'cccの変更依頼'
 'dddの変更依頼'
 などが金曜日定時後に自動集計されます。
 */

}

これで下準備おしまいです。
すると毎週金曜日23時に過去1週間のメール内容を自動分析して、アウトプット用のグラフを自分に送りつけます。

f:id:kazukichi_0914:20211020155629g:plain

f:id:kazukichi_0914:20211020160622g:plain

これで資料作成完了なので、あとは上司に報告すればおしまいです。

トリガー(自動起動)ってなんなんだ?

トリガーというのはプログラミングをする上で非常に重要な概念です。
f:id:kazukichi_0914:20211020154111g:plain
引用:
https://www.irasutoya.com/2015/02/blog-post_458.html

銃のピストルの引き金をトリガーというといいます。
そうです。

「引き金」です。

自分が業務をする時に何かきっかけがあるはずです。
〜〜に依頼されたら、雨が降ったら、月末になったら

takakisan.com
引用:
https://takakisan.com/gas-trigger-introduction/

プログラム発動して上司に報告をしましょう。
楽ちんですね。

可用性をチェックしよう

f:id:kazukichi_0914:20211020154711g:plain

プログラムは通勤電車のように決まった時刻、決まった条件で動きます。
しかし人身事故があるように時にミスってしまいます。
プログラムも絶対じゃないんですね。

基本的にITに疎い人はコンピュータが壊れると怒ります。

機械のくせにどうしてミスるんだと…
でも機械も完璧じゃないんですよ。
なので、ちゃんと動作しているかを人間の目でたまにチェックしてあげましょう。