Apps Script でGoogleカレンダの重複を削除

私は会社でOutlookのカレンダを使い、プライベートではGoogleカレンダを使用しています。会社にMicrosoft 365を導入してからは、Teams会議の予定が追加されるようになり、Googleカレンダーで一括で予定を見ることが難しくなりました。

そこで考えたのがMicrosoft Power AutomateでOutlookのカレンダーに予定が追加されたときに、Googleカレンダに追加反映することです。

はじめは簡単に考えてたので適当にやってたら、大量の重複予定がGoogleカレンダに追加されてしまいました。

一つ一つ手作業で予定を削除するのが大変だったので、Google Apps Scriptで重複したメールを削除することを考えました。

プログラムの流れ

以下のような流れで作成しました。

カレンダIDからカレンダオブジェクトを取得
カレンダIDからカレンダオブジェクトを取得
日付を指定して、予定のオブジェクト配列に追加
日付を指定して、予定のオブジェクト配列に追加
予定配列から重複しているものを削除
予定配列から重複しているものを削除
Text is not SVG – cannot display

プログラムの説明

カレンダオブジェクトの取得

カレンダオブジェクトを取得するにはカレンダIDが必要です。IDはカレンダ → 設定と共有 → カレンダの統合で確認できます。

function getCalendar() {
  return CalendarApp.getCalendarById("カレンダーID@group.calendar.google.com");
}

開始時間と終了時間の取得

dateSter “2000/11/12″の形

end: 終了日を指定したいときはTrueを指定。

(時間に23:59:59を付加して返す)

予定を取得するために開始時間と終了時間が必要なので、文字列の日付の文字列からDateオブジェクトを取得する関数です。

ただ、日付を指定するだけだと、時刻が0時0分0秒となってしまうので、終了時刻は23時59分59秒となるようにしました。

function getDesignatedDate(dateStr, end) {
  const dateArray = dateStr.split("/", 3);
  const year = +dateArray[0];
  const month = +dateArray[1];
  const day = +dateArray[2];
  let date;
  if (end) {
    date = new Date(year, month - 1, day, 23, 59, 59);
  } else {
    date = new Date(year, month - 1, day);
  }
  console.log(date);
  return date;
}

カレンダイベント配列を取得

カレンダオブジェクトと開始時刻、終了時刻からイベント配列を取得する関数

function getEventsStertToEnd() { 
  const startDate = getDesignatedDate(startDateStr, false); 
  const endDate = getDesignatedDate(endDateStr, true); 
  const calendar = getCalendar(); 
  const events = calendar.getEvents(startDate, endDate); 
  return events 
}

重複チェック

初めは配列の直前の要素と比較して、削除するかどうか切れようと思ったが、ばらばらなじゅんばんで来ることもあるようなので、配列内を全て調べて同じものがあれば、削除するようにしたしました。

また、Eventオブジェクトをそのまま比較するのは大変そうなので、いったんオブジェクト配列を作成して比較することにした。

class eventProp {
  constructor(title, start, end, isAlldayEvent) {
    this.title = title;
    if (isAlldayEvent) {
      this.isAlldayEvent = isAlldayEvent;
    } else {
      this.start = start;
      this.end = end;
    }
  }
}

重複チェックのための配列(グローバル)

let EventArray = new Array();

カレンダイベントをに重複があるかチェック

newEvent重複を確認するイベント。

Dateオブジェクトはいったん文字列に変換しないと、同じか判別できなませんでした。

function addEventArray(newEvent) {
  //重複チェックのためのイベントクラス。
  const newProp = new eventProp(
    newEvent.getTitle(),
    newEvent.getStartTime().toString(), //文字列に変換しないと、同じか判別できない。
    newEvent.getEndTime().toString(),   //文字列に変換しないと、同じか判別できない。
    newEvent.isAlldayEvent
    );

  //最初は重複チェック用配列に格納
  if(!EventArray){
    EventArray.push(newProp);
    return false;
  }
  //配列全体を確認し、重複があればTrue
  
  //配列全体を確認し、重複があればTrue 
  const isExist = EventArray.some((prop) => { 
    return prop.title === newProp.title && 
     prop.start === newProp.start && 
     prop.end === newProp.end && 
     prop.isAlldayEvent === newProp.isAlldayEvent 
  });

  if (isExist) {
    //重複があればTrueを返す。
    console.log(`${count} : ${newProp.title}を削除`);
    return true;
  } else {
    //重複がなければ重複チェック用配列に格納
    EventArray.push(newProp);
    return false;
  }
}

カレンダから重複イベントを削除(Mainメソッド)

イベント配列をMap関数ですべて確認し、重複があればイベントを削除

function deleteEvents() {
  //イベント配列を取得
  const events = getEventsStertToEnd();
  //イベント配列の中から、重複があれば削除
  events.map((event) => {
    if (addEventArray(event)) {
      event.deleteEvent();
    } 
  });
}

ちなみにPowerAutomateはこのサイトを参考にしたらばっちりでした。

M365 予定表を Power Automate で Googleカレンダー へ同期する(追加・編集・削除 全対応)トリガーV3更新版

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です