ゴミ回収予定の自動入力スクリプトの解説

GAS

本記事では、以下の記事で紹介した、ごみ回収の予定をGoogleカレンダーに自動で入力するGASコードについて解説します。

ゴミの回収スケジュールは各自治体毎に異なるため、転居するとゴミ回収のスケジュールが変わり、都度自治体が配布する資料を確認しなければならなくなることがあります。そこで、ごみ回収のスケジュールをGoogleカレンダーに入れておくと、簡便に回収スケジュールを確認することができます。Googleカレンダーでは入力した予定を、定期的に繰り返す機能が用意されており、カスタム繰返しを用いることで様々な条件で予定を繰り返すことができます。この繰り返し機能を用いることで、ごみ捨て予定を比較的簡単にGoogleカレンダーに入力することができますが、GAS(Google App Script)を用いてGoogleカレンダーを操作すると、祝日の場合は回収が無いなど、より柔軟なごみ回収予定を入力することができます。

前の記事では、以下のようなごみ回収スケジュールを例として、Googleカレンダーに回収予定を入力する以下のGASコードを紹介しました。スクリプトコードの使い方や設定方法は前の記事を確認してください。

ゴミの種別回収日
可燃ごみ毎週月・金曜日
不燃ごみ第一・三木曜日
プラスチックごみ毎週水曜日(祝日を除く)
段ボール第一・三火曜日(祝日を除く)
新聞・チラシ第二・四火曜日(祝日を除く)
ごみ回収予定



// カレンダーのIDを設定 取得したカレンダーのIDを入力してください。
const calendar_id="*****************@group.calendar.google.com";
// カレンダーを設定
const calendar=CalendarApp.getCalendarById(calendar_id);
// 当日を設定
const today=new Date();

// 祝日かどうかを判定
const is_Holiday=(day)=>{
  // Googleの祝日カレンダーを取得
  const calendar_h=CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com");
  // 祝日カレンダーの内容を取得
  const events=calendar_h.getEventsForDay(day);
  
  if (events.length>0){return true;}
  else{return false;}

};

// 特別に除外する日を設定
const is_SpecialDay=(day0)=>{
  const day=new Date(day0);
  const m=day.getMonth();
  const d=day.getDate();

  let flag=false;

  // 三が日を除外
  if(m==1 && d==1){flag=true;}
  if(m==1 && d==2){flag=true;}
  if(m==1 && d==3){flag=true;}

  return flag;

};

const add_event=(day,title,start,end)=>{
  // 同一名称の予定の重複入力を回避
  let flag=true;
  const events=calendar.getEventsForDay(day);
  for (const event of events){
    if (event.getTitle()==title){flag=false;}
  }
  // 予定の入力
  if (flag){calendar.createEvent(title,start,end);}
};

// 可燃ごみの予定を追加 月・金
const add_BurnableGabage=(day0)=>{
  const day=new Date(day0);
  // 予定時間をam 6:00~8:00に設定
  const start=new Date(day.setHours(6));
  const end=new Date(day.setHours(8));
  // スケジュールのタイトルを設定
  const title="可燃ごみ";

  // 月曜・金曜
  if (day.getDay()==1 || day.getDay()==5){
    add_event(day,title,start,end);
  }
};

// 不燃ごみの予定を追加 第1・3木曜日
const add_NonBurnableGabage=(day0)=>{
  const day=new Date(day0);
  // 予定時間をam 6:00~8:00に設定
  const start=new Date(day.setHours(6));
  const end=new Date(day.setHours(8));
  // スケジュールのタイトルを設定
  const title="不燃ごみ";

  // 木曜
  if (day.getDay()==4){
    // 第1, 3週
    if (Math.floor(day.getDate()/7)==0 || Math.floor(day.getDate()/7)==2){
      add_event(day,title,start,end);
    }
  }
};

// プラスチックごみの予定を追加 水曜日(祝日を除く)
const add_Plastic=(day0)=>{
  const day=new Date(day0);
  // 予定時間をam 6:00~8:00に設定
  const start=new Date(day.setHours(6));
  const end=new Date(day.setHours(8));
  // スケジュールのタイトルを設定
  const title="プラスチックごみ";

  // 水曜
  if (day.getDay()==3){
    if (!is_Holiday(day)){
      add_event(day,title,start,end);
    }
  }
};

// 段ボールごみの予定を追加 第1・3火曜日(祝日を除く)
const add_CardBoard=(day0)=>{
  const day=new Date(day0);
  // 予定時間をam 6:00~8:00に設定
  const start=new Date(day.setHours(6));
  const end=new Date(day.setHours(8));
  // スケジュールのタイトルを設定
  const title="段ボールゴミ";
  
  // 火曜日
  if (day.getDay()==2){
    // 第1, 3週
    if (Math.floor(day.getDate()/7)==0 || Math.floor(day.getDate()/7)==2){
      if(!is_Holiday(day)){
        add_event(day,title,start,end);
      }
    }
  }
};

// 新聞・チラシごみの予定を追加 第2・4火曜日(祝日を除く)
const add_Newspapers=(day0)=>{
  const day=new Date(day0);
  // 予定時間をam 6:00~8:00に設定
  const start=new Date(day.setHours(6));
  const end=new Date(day.setHours(8));
  // スケジュールのタイトルを設定
  const title="新聞・チラシゴミ";
  
  // 火曜日
  if (day.getDay()==2){
    // 第2, 4週
    if (Math.floor(day.getDate()/7)==1 || Math.floor(day.getDate()/7)==3){
      if(!is_Holiday(day)){
        add_event(day,title,start,end);
      }
    }
  }
};

// スケジュールを追加
function add_schedule(){
  // 時間を0:00:00:00にして日時を取得
  const day=new Date(today)
  day.setHours(0);
  day.setMinutes(0);
  day.setSeconds(0);
  day.setMilliseconds(0);

  // 40日分予定を処理
  for(let i=0;i<40;i++){

    if (!is_SpecialDay(day)){
      // 可燃ごみの予定を追加
      add_BurnableGabage(day);
      // 不燃ごみの予定を追加
      add_NonBurnableGabage(day);
      // プラスチックごみの予定を追加
      add_Plastic(day);
      // 段ボールごみの予定を追加
      add_CardBoard(day);
      // 新聞・チラシごみの予定を追加
      add_Newspapers(day);
    }
    // 日付を更新
    day.setDate(day.getDate()+1);
  }
}

この記事では、上記のスクリプトコードについて解説します。

主な関数

メインの関数

メインとなる関数は”add_schedule()”で、この関数を実行することにより、ごみ回収の予定が入力されます。それ以外の”add_*()”という関数は、各ゴミについて回収日の条件を設定する関数となっており、”add_schedule()”でこれらの関数が呼び出されます。”add_*()”の処理を変更あるいは追加することによって、任意の条件でゴミ回収の予定を入力することができます。

// スケジュールを追加
function add_schedule(){  }

// 可燃ごみの予定を追加 月・金
const add_BurnableGabage=(day0)=>{  };

// 不燃ごみの予定を追加 第1・3木曜日
const add_NonBurnableGabage=(day0)=>{  };

// プラスチックごみの予定を追加 水曜日(祝日を除く)
const add_Plastic=(day0)=>{  };

// 段ボールごみの予定を追加 第1・3火曜日(祝日を除く)
const add_CardBoard=(day0)=>{  };

// 新聞・チラシごみの予定を追加 第2・4火曜日(祝日を除く)
const add_Newspapers=(day0)=>{  };

サブの関数

以下の関数は、それぞれの処理をまとめた関数で、”add_schedule()”や”add_*()”で呼び出して使用します。

// 祝日かどうかを判定
const is_Holiday=(day)=>{  };

// 特別に除外する日を設定
const is_SpecialDay=(day0)=>{  };

// カレンダーに予定を入力
const add_event=(day,title,start,end)=>{  };

グローバル変数

このコードを実行すると、まず、グローバル変数として以下の変数が生成されます。

// カレンダーのIDを設定 
const calendar_id="******@group.calendar.google.com";
// 取得したGoogleカレンダーのIDを文字列として変数に代入します。

// カレンダーを設定
const calendar=CalendarApp.getCalendarById(calendar_id);
// Google カレンダーを操作するためにはCalendarAppクラスを使用します。
// .getCalenarById()メソッドを用いる事で引数に与えたIDに対応したカレンダーを取得することができます。
// calendarはCalendarクラスとなります。

// 当日を設定
const today=new Date();
// Dateオブジェクトとして実行時の日付データを取得します。

add_schedule()

この関数はスクリプトのメインの関数で、この関数を実行することによって、Googleカレンダーに予定が入力されます。

function add_schedule(){

  // 時間を0:00:00:00にして日時を取得
  const day=new Date(today)
  // todayのデータをdayにコピーします。
  // day=todayとすると参照コピーとなりdayの変更がtodayにも反映されるため注意が必要です。

  day.setHours(0);
  day.setMinutes(0);
  day.setSeconds(0);
  day.setMilliseconds(0);
  // dayの情報には実行時の時間も含まれていますが、使用するのは日時のデータのみなので、
  // 時間以降のデータを0にしています。0 h 00 min 00.000 s

  // 40日分予定を処理
  for(let i=0;i<40;i++){
  // for loopを用いて40回分のループ処理を行います。

    if (!is_SpecialDay(day)){
    // 三が日など、事前に指定した日以外について、処理を実行します。

      // 可燃ごみの予定を追加
      add_BurnableGabage(day);
      // 不燃ごみの予定を追加
      add_NonBurnableGabage(day);
      // プラスチックごみの予定を追加
      add_Plastic(day);
      // 段ボールごみの予定を追加
      add_CardBoard(day);
      // 新聞・チラシごみの予定を追加
      add_Newspapers(day);
    } // if end

    // 日付を更新
    day.setDate(day.getDate()+1);
    // 日付を一日進めます。
    // .getDate()メソッドは日を取得できます。
    // .setDate()メソッドで引数を日として設定できます。
    // .setDate()で存在しない日が指定された場合、対応する日が設定されます。
    // e.g. 6/32とした場合、7/2が設定されます。

  } // for end
}

add_CardBoard()

”add_*()”は類似の関数なので、最も条件が複雑な段ボールゴミに関する関数”add_CardBoard()”について解説します。

// 段ボールごみの予定を追加 第1・3火曜日(祝日を除く)
const add_CardBoard=(day0)=>{
// アロー関数を用いて関数を定義しています。
// function ***(){}という形で定義しても構いません。

  const day=new Date(day0);
  // 引数として与えられた日付データをコピーします。

  // 予定時間をam 6:00~8:00に設定
  const start=new Date(day.setHours(6));
  const end=new Date(day.setHours(8));
  // Googleカレンダーに入力する予定の開始日時と終了日時を設定します。
  // ここでは朝6時から朝8時としています。
  // 各自治体のごみ回収の時間帯に合わせて任意の時間を設定して構いません。

  // スケジュールのタイトルを設定
  const title="段ボールゴミ";
  // Googleカレンダーに入力する予定のタイトルを設定します。
  
  // 火曜日
  if (day.getDay()==2){
 // .getDay()メソッドで曜日が取得できます。
  // 0:日曜日 ~ 6:土曜日です。

    // 第1, 3週
    if (Math.floor(day.getDate()/7)==0 || Math.floor(day.getDate()/7)==2){
    // 第1, 3週の場合のみ処理を行います。
    // Math.floor()は引数の小数点以下の値を切り捨て整数を返します。
    // ||はorを表す論理演算子です。

      if(!is_Holiday(day)){
      // 祝日でない場合のみ処理を実行します。

        add_event(day,title,start,end);
        // カレンダーに予定を入力します。

      } // if end
    } // if end
  } //if end
};

is_Holiday()

この関数は、祝日か否かの判定を行う関数で、祝日とそれ以外で処理を分岐するために用います。

// 祝日かどうかを判定
const is_Holiday=(day)=>{

  // Googleの祝日カレンダーを取得
  const calendar_h=CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com");
  // Googleが提供している日本の祝日をまとめたカレンダーを取得します。
  // calendar_hはcalendarクラスです。

  // 祝日カレンダーの内容を取得
  const events=calendar_h.getEventsForDay(day);
  // .getEventsForDay()メソッドで引数に指定した日に入力されている予定をすべて取得します。
  // 祝日カレンダーでは祝日の情報が予定として格納されています。
  // eventsはCalendarEvent[](配列)となります。
  
  if (events.length>0){return true;}
  // 配列に対して.lengthで要素数が取得できます。
  // eventsが一つ以上の要素を持つ場合"true"(祝日である)を返します。

  else{return false;}
  // 祝日でない場合は"false"を返します。
};

is_SpecialDay()

この関数では、特定の日を指定し、その日か否かで処理を分岐するために用います。スクリプトないでは三が日を指定し、三が日についてはすべてのごみの回収が行われないものとしています。

// 特別に除外する日を設定
const is_SpecialDay=(day0)=>{
  const day=new Date(day0);
  
  const m=day.getMonth();
  // .getMonth()メソッドで月が取得できます。

  const d=day.getDate();
  // .getDate()メソッドで日が取得できます。

  let flag=false;
  // 指定した日かを判定するための真偽値です。
  // 指定した日に合致する場合"true"に変更されます。

  // 三が日を除外
  if(m==1 && d==1){flag=true;}
  if(m==1 && d==2){flag=true;}
  if(m==1 && d==3){flag=true;}
  // 上から順に1/1, 1/2, 1/3を指定しています。

  return flag;
  // 判定の結果を返却します。
  // true or false

};

add_event()

Googleカレンダーに予定を入力するための関数です。指定した日にすでに同じ名称の予定が入っている場合には新たな予定は作成されません。

const add_event=(day,title,start,end)=>{
// 引数
// day: 対象となる日付
// title: 予定の名称
// start: 予定の開始時間
// end: 予定の終了時間

  // 同一名称の予定の重複入力を回避
  let flag=true;
  // 予定の重複を真偽値で判定します。
  // 同名の予定が既に指定した日に入っている場合は"false"に変更されます。

  const events=calendar.getEventsForDay(day);
  // dayで指定した日の予定をすべて取得します。

  for (const event of events){
  // for of loopにて、取得したすべての予定に関してループ処理します。

    if (event.getTitle()==title){flag=false;}
    // .getTitle()メソッドで予定の名称を取得できます。
    // 同一名称の予定が無いかチェックを行います。

  } // for end

  // 予定の入力
  if (flag){calendar.createEvent(title,start,end);}
  // 予定の重複が無い場合は予定の入力を行います。
  // .createEvent()メソッドでGoogleカレンダーに予定を新規作成できます。
  // [引数]
  // title: 予定の名称
  // start: 予定の開始時間
  // end: 予定の終了時間
};

タイトルとURLをコピーしました