見出し画像

【GAS】Google Apps Script 活用事例 祝日のみ処理をスキップするスクリプト

祝日を2次元配列で取得する

/**
 * 祝日を取得する
 * [[ '勤労感謝の日', '2022-11-23', '祝日' ]]
 * @return {Array.<Array.<string>>}
 * 
 */
function getHoliday(){
  const cal = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
  const startDate = new Date();
  const endDate   = new Date();
  endDate.setMonth(endDate.getMonth()+3);

  const events = cal.getEvents(startDate, endDate).map(event => ({
    title:       event.getTitle(),
    date:        Utilities.formatDate(event.getStartTime(), 'JST', 'yyyy-MM-dd'),
    description: event.getDescription()
    })
  );

  const keys   = Object.keys(events[0]);
  const values = events.map(event => keys.map(key => event[key]));

  console.log(values);
  return values
}

今回は予定を取得したいカレンダーが一つでしたが、calIdを引数にすると汎用性が高くなりそうです。

祝日の際に処理をスキップする


const formatDate = (date, number, format) => {
  date.setDate(date.getDate() + number);
  return Utilities.formatDate(date, 'JST', format);
}


/**
 * 
 * カレンダーの予定を参照して
 * confluenceの議事録を自動作成するためのテストコード
 * 
 * 
 */
function test002(){

  //1ヶ月間の予定を取得する
  const cal    = CalendarApp.getCalendarById('sample@gmail.com');
  const startDate = new Date();
  const endDate   = new Date();
  endDate.setMonth(endDate.getMonth()+1);

  //祝日を2次元配列で取得する
  // [[ '勤労感謝の日', '2022-11-23', '祝日' ]]
  const holidays      = getHoliday();
  const holidaysArray = holidays.map(row => row[1]); //'2022-11-23'
  console.log(holidaysArray);

  const events = cal.getEvents(startDate, endDate);


  for(const event of events){
    const title = event.getTitle();

    //定例MTG-Aもしくは定例MTG-Bに該当した時
    if(title.includes('定例MTG-A') || title.includes('定例MTG-B')){
      
      //イベントの開始予定時刻を文字列で取得
      const startTime = formatDate(event.getStartTime(), 0, 'yyyy-MM-dd');

      //祝日に該当したら処理をスキップする
      if(holidaysArray.indexOf(startTime) !== -1){
        console.warn(`${startTime}は、祝日です。`);
        continue;
      }

      console.log(title, startTime);

      //具体的な処理を書いていく

    }//if
  }
}



/**
 * 祝日を取得する
 * [[ '勤労感謝の日', '2022-11-23', '祝日' ]]
 * @return {Array.<Array.<string>>}
 * 
 */
function getHoliday(){
  const cal = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
  const startDate = new Date();
  const endDate   = new Date();
  endDate.setMonth(endDate.getMonth()+3);

  const events = cal.getEvents(startDate, endDate).map(event => ({
    title:       event.getTitle(),
    date:        formatDate(event.getStartTime(), 0, 'yyyy-MM-dd'),
    description: event.getDescription()
    })
  );

  const keys   = Object.keys(events[0]);
  const values = events.map(event => keys.map(key => event[key]));

  console.log(values);
  return values
}



社員が日々面倒くさいなぁ〜と思っている仕事が自分に回ってくるのですよ。ハッキリ言って俺も面倒くさいです。
「は?そんなん自分でやれし!!」と声を大にして呟いています。(テレワーク)

しかし社員の立場からすると、ある意味DXだよな…..と。

出典:心の中の叫び

定例MTG-Aと定例MTG-Bの前に、議事録のテンプレートをコピーして新しいページを作るという地味にめんどい簡単なお仕事をやる羽目になりました。

定例MTG-Aの1日前でも1時間前でもいいのですが、トリガーを設定する関数を作る必要がありそうです。

特定の日時で処理を実行する

続きをこうご期待

トリガーの設定

/**
 * 1回限りのトリガーを指定日の午前9:00に設定する
 * @param {string} string - yyyy-MM-dd形式で指定(例)'2022/11/22'
 * 
 */
function createNewTriggers(string){
  const date = new Date(string);
  date.setDate(date.getDate()-1);
  date.setHours(9);
  date.setMinutes(0);

  ScriptApp.newTrigger('generateHeaderObject').timeBased().at(date).create();
  const stringDate = Utilities.formatDate(date, 'JST', 'yyyy-MM-dd HH:mm');``

  console.log(`${stringDate}に、トリガーを設定しました。`);
  //expected output: 2022-11-21 9:00

}

Confluence APIを使用したページ作成

confluence APIを使ったスクリプトは以前書いたので、イケるかなーと思っています。

祝日のみ処理をスキップするスクリプトは、違う形で書いたことがあったので、もしかしたら需要があるかもしれないと思い、形に残しておく事にしました。

関連するスクリプト


この記事が気に入ったらサポートをしてみませんか?