#あすみかんの上にあすみかん

#たのしいことしかかかないことをここに決意します

新卒がchatworkAPIとGASで通知システムをコリっ

おはようございますっぴ〜〜〜〜〜〜〜!!!

昨日小田原を歩いてたら、でかいゴロゴロ引いたお兄さんが話しかけて来ていたのでイヤホン取ったらなんか高いお菓子買わされたよ〜〜〜〜〜〜〜〜!!!あすみで〜〜〜す!ドコドン!



 

Hamee Advent Calenderの11日目の更新です!!

 


Hameeには「あしながおじさん」がいてな

「新卒のお昼ご飯を支援してくれる制度」がHameeにはあります。
それがあしながおじさん制度です。

食堂であしながおじさんのおマネーを使った食べ物を食べて、
お金がない新卒を補助&社員のみんなと交流する目的で作られた制度です。

 


とにかくハッピーな制度なのです!!!!(わっしょい)

 

とにかくなんでも頼む新卒

最初は躊躇していたものの、
「あ、これ、本当になんでも頼んでも良いんだ...」と思った新卒たちはばっこり食べ物を頼んで行きます。

そこでちょっとした問題が。
食べ物を頼みすぎて、賞味期限が切れてしまう食べ物が出て来てしまう事案が、、
 (悲しい・・・)

賞味期限を可視化して通知する

みんなでソrrrrrューション(巻き舌)を考えた結果、

  • 月の担当者がシートに賞味期限を記入
  • 賞味期限近くなったらチャットに通知

GASとchatworkAPIを使って作ってみたいとおもいマスッ!!!!!!!ギョギョ〜〜

そこで作った10月の私

function myFunction() {
    // スプレッドシートを取得
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

    // 日付の取得
    var today = new Date();

    // 賞味期限のチェック
    this.sendMessageExpirationDate(spreadsheet, today);
}

/**
* 賞味期限の確認のメッセージを送るメソッド 
* TODO: ごりごりに汚いので時間あるときに修正したい
* @param {object} あしながのスプレッドシートオブジェクト
* @param {object} 今日の日付
**/
function sendMessageExpirationDate(spreadsheet, today) {
    // 食べ物シートの取得
    var foodSheet = spreadsheet.getSheetByName('食べ物シート');

    // 賞味期限を配列で取得
    var lastArrayNum = foodSheet.getLastRow();

    // リファクタしたい
    if(lastArrayNum === 0) return false;

    var dayArray = foodSheet.getRange(2, 3, lastArrayNum - 1).getValues();

    var is7daysExpiration = false;
    var is3daysExpiration = false;
    var isTodayExpiration = false;

    for(var jj = 0; jj < lastArrayNum - 1; jj++){
        var spreadsheetDay = dayArray[jj][0];

        // 今日から3日後の日付と7日前の日付をセット
        var after7daysFromToday = new Date();
        var after3daysFromToday = new Date();

        after7daysFromToday.setDate(after7daysFromToday.getDate() + 7);
        after3daysFromToday.setDate(after3daysFromToday.getDate() + 3);

        if(isSameDay(spreadsheetDay, after7daysFromToday)) is7daysExpiration = true;
        if(isSameDay(spreadsheetDay, after3daysFromToday)) is3daysExpiration = true;
        if(isSameDay(spreadsheetDay, today)) isTodayExpiration = true;
    }

    var message = '賞味期限が';
    if(is7daysExpiration) message += '7日前 ';
    if(is7daysExpiration) message += '3日前 ';
    if(isTodayExpiration) message += '今日 ';
    message += 'のものがあります!!確認してください!! → <<スプレッドシートURL>>
    this.sendMessage(message, 'toall');
}

/**
* chatworkでメッセージを送信する
* @param {string} メッセージ
* @param {int|string} アカウントid or toall
**/
function sendMessage(message, managerId) {
    var to = '[To:' + managerId +'] ';
    if (managerId === 'toall') to = '[toall] ';

    var client = ChatWorkClient.factory({token: '<<chatworkのAPIトークン>>'});
    client.sendMessage({room_id: <<chatworkのルームid>>, body: to + message});
}

/**
* 日付を比べ、今日と同じだったらtrueをかえす
* @param {object} 日付のデータ
* @param {object} 日付のデータ
**/
function isSameDay(day1, day2) {
    if (typeof(day1) !== 'object' || typeof(day2) !== 'object') return false;
    day1 = Utilities.formatDate( day1, 'Asia/Tokyo', 'Md');
    day2 = Utilities.formatDate( day2, 'Asia/Tokyo', 'Md');
    if(day1 === day2) return true;
    return false;
}

 

 

 







ナンジャコリャー!!!!!!!!!!!わけワカメやんけーーー!!!

 

  1. 変数の名前一般的すぎるものがある
  2. for文でめっちゃ同じもの生成してる(笑)(笑)(笑)(笑)
  3. リファクタしたい←何をやねん!!!!

ごりごりなのは置いといて、2ヶ月前に書いた自分のコードにここまで突っ込めると思えませんでした、、、ウケる、、、

頭の中の後藤*1にこっぴどく怒られるコードです😟


そして直した12月の私

  • lastArrayNum → lastRowNumに変更
  • dayArray → expirationDateColumns
  • for文のループから無駄な初期化を外に出す
  • コメントをちょびちょび変更
function sendMessageExpirationDate(spreadsheet, today) {
    // 食べ物シートの取得
    var foodSheet = spreadsheet.getSheetByName('食べ物シート');

    // 最終行の取得
    var lastRowNum = foodSheet.getLastRow();

    // 行数が1→ヘッダーのみの存在になるため、データがない
    if(lastRowNum < 2) return false;
  
    // 賞味期限の列取得
    var expirationDateColumns = foodSheet.getRange(2, 3, lastRowNum - 1).getValues();

    var is7daysExpiration = false;
    var is3daysExpiration = false;
    var isTodayExpiration = false;
  
    // 今日から7日後,3日後の日付をセット
    var after7daysFromToday = new Date();
    after7daysFromToday.setDate(after7daysFromToday.getDate() + 7);

    var after3daysFromToday = new Date();
    after3daysFromToday.setDate(after3daysFromToday.getDate() + 3);
  
    for(var jj = 0; jj < lastRowNum - 1; jj++){
        // 要素も配列になっているため、[0]で要素を取り出す必要がある
        var spreadsheetDay = expirationDateColumns[jj][0];
    
      if(isSameDay(spreadsheetDay, after7daysFromToday)) is7daysExpiration = true;
      if(isSameDay(spreadsheetDay, after3daysFromToday)) is3daysExpiration = true;
      if(isSameDay(spreadsheetDay, today)) isTodayExpiration = true;
    }
  
    var message = '賞味期限が';
    if(is7daysExpiration) message += '7日前 ';
    if(is7daysExpiration) message += '3日前 ';
    if(isTodayExpiration) message += '今日 ';
    message += 'のものがあります!!確認してください!! →  <<スプレッドシート>>
    this.sendMessage(message, 'toall');
}


とりあえず、ぴょんと直せるところはこれくらいですね、、、
きっと他にも、根本的にダメなところがあると思うのですが、
まだまだ未熟なので教えていただければ嬉しいです☺️

とにかく2ヶ月前でもこんだけツッコミどころあるんだから、
コード書くときは今以上に気をつけて書かなきゃとゆうことを身を以て感じました、、、

きっとこのコードも後藤に圧される*2んだろうと確信し震えながら
私は日々生きていきたいと思います。
読んでくれてありがとうございましたチョンチョン!!!!!

*1:私の会社の先輩。私がコードを書くときはいつも頭の中に出てきて「そのコードやばくね?」と圧を送ってくれる。この先わたしの頭の中から後藤が消えることは無い。

*2:私の書くコードを褒めてもらうには、概算でも3年かかる見込みである