2020年10月9日金曜日

Google Apps Script 祝日を考慮した平日に電気をつける

※ 以前使用していたスクリプトのメモ。スマートリモコンを変更してから、遅延がひどくなったので使用停止中。

Google スプレットシート:Holiday

Google Apps Script:Holiday

記載したスクリプト
// その日の指定時刻にトリガーを設定
function setTrigger() {

  var today = new Date();

  //スプレットシートを呼び出して、指定時間を取得
  var spreadsheet = SpreadsheetApp.openById('Google スプレットシートのURLの黒塗り部分');
  var sheet = spreadsheet.getActiveSheet();
  //var setTime = sheet.getRange('B3').getDisplayValue();
  var value = sheet.getRange('B3:D3').getValues();
  var setTime = value[0][0];
  var hitDate = value[0][1];
  var delDate = value[0][2];
  Logger.log('設定時間 %s', setTime);
  if( delDate.getFullYear() == today.getFullYear() && delDate.getMonth() == today.getMonth() && delDate.getDate() == today.getDate() ){
    Logger.log('解除日 %s', delDate);
    //sheet.getRange("D3").setValue("");
    return;
  }

  if( hitDate.getFullYear() == today.getFullYear() && hitDate.getMonth() == today.getMonth() && hitDate.getDate() == today.getDate() ){
    Logger.log('実行日 %s', hitDate);
    //sheet.getRange("C3").setValue("");

  } else {
    //土日か判定
    var weekInt = today.getDay();
    if(weekInt <= 0 || 6 <= weekInt){
      Logger.log('土日');
      return;
    }
    
    //祝日か判定
    var calendarId = "ja.japanese#holiday@group.v.calendar.google.com";
    var calendar = CalendarApp.getCalendarById(calendarId);
    var todayEvents = calendar.getEventsForDay(today);
    if(todayEvents.length > 0){
      Logger.log('祝日');
      return;
    }
  }

  var setHour = 6;
  var setMinute = 0;
  var offset = setTime.indexOf('時');
  if( offset != -1 ){
    setHour = setTime.substr(0, offset).replace(/[^\d]/g, '');
    setMinute = setTime.substr(offset+1).replace(/半/, '30').replace(/[^\d]/g, '');
  }
  Logger.log('設定時間 [%s] 時 [%s] 分', setHour, setMinute);

  // 7時~18時は、指定があっても電気をつけない
  if( setHour > 7 && setHour < 18 ){
    Logger.log('電気オン不要');
    return;
  }

  //時間の判定
  var hour = today.getHours();
  var min = today.getMinutes();
  if( hour*60+min > setHour*60+setMinute ){
    Logger.log('時間過ぎ');
    return;
  }

  //新しいトリガーを作成(秒の誤差をなくすため、1分前に起動 ※0時未対応)
  if( setMinute == 0 ){
    today.setHours(setHour-1);
    today.setMinutes(59);
  } else {
    today.setHours(setHour);
    today.setMinutes(setMinute-1);
  }
  ScriptApp.newTrigger("main").timeBased().at(today).create();
  Logger.log('トリガー設定');
}

// その日のトリガーを削除する関数(消さないと残る)
function deleteTrigger() {
  var triggers = ScriptApp.getProjectTriggers();
  for(var i=0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() == "main") {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
}

// 実行したいスクリプト本体
function main() {
  deleteTrigger();

  // 秒の誤差をなくす
  var today = new Date();
  Utilities.sleep((60-today.getSeconds())*1000);

  // IFTTT の Webhook URL
  var url = "https://maker.ifttt.com/trigger/Holiday/with/key/~";
  var response = UrlFetchApp.fetch(url);
  var content = response.getContentText("UTF-8");
  Logger.log('電気オン');
}