7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【GAS】スプレッドシートからGoogle Calendarの予定を一括で登録・確認・削除する

Last updated at Posted at 2020-05-03

はじめに

Google Calendarの記事をまとめて追加、確認、削除するスプレッドシートを作りましたので紹介します。
Google Apps Scriptの始め方、Google Calendarの操作は以下の記事を参照してください。

できること

メニュー一覧

自分で追加した「カレンダー更新」タブのメニューから更新を行うことができます。
image.png

予定の一括登録

以下のようなスプレッドシートがあり、「カレンダー更新」タブからカレンダーの予定の追加ができます。
image.png

カレンダーに予定が追加された様子です。
image.png

予定の一括確認・削除

集計開始日から終了日までの予定を確認でき、B列に1をいれた予定の一括削除も行うことができます。
image.png

5/5の予定が削除された様子です。
image.png

実装

※今回は予定の登録を行うシートを「予定追加用シート」、確認と削除を行うシートを「予定削除用シート」としています。

メニューの追加

まず、更新メニューを追加したいので、スプレッドシートを開いた際に実行されるonOpen関数で対応するボタンと関数を定義します。

function onOpen(){
  // メニューの追加
  var menu = [
    {name: '予定の登録', functionName: "createEvent"},
    {name: '予定の確認', functionName: "getCalendarEvent"},
    {name: '予定の削除', functionName: "deleteEventById"}
  ];

  SpreadsheetApp.getActiveSpreadsheet().addMenu("カレンダー更新", menu);
}

予定の一括登録

この記事で紹介したように、予定の追加には予定を追加するカレンダーのメールアドレスのほかに、「件名、開始時間、終了時間、説明、ゲスト、場所」があればよいので、スプレッドシートにそれらの項目を用意します。それを2次元配列として読み込んで、イベントごとに追加の処理をします。

予定追加用シート↓
image.png

function createEvent() {
  var sheet   = SpreadsheetApp.getActive().getSheetByName('予定追加用シート');
  var idRange = sheet.getRange(2,3);
  var id      = idRange.getValue();
  var cal     = CalendarApp.getCalendarById(id);
  var lastRow = sheet.getDataRange().getLastRow();
  var lastCol = sheet.getDataRange().getLastColumn();
  
  var eventRange = sheet.getRange(8,2,lastRow-8,lastCol-2);
  var event      = eventRange.getValues();
  
  // イベントごとに登録
  for (var i = 0; i < event.length; i++){
    var title     = event[i][0];
    var startTime = event[i][3];
    var endTime   = event[i][4];
    
    var guests = event[i][1] + ',' + event[i][2];
    var option = {
      description : event[i][5],
      guests : guests,
      location : event[i][6]
    }
    cal.createEvent(title, startTime, endTime, option);
  }
}

予定の確認

予定の確認はこの記事で予定の取得方法(event)は説明したのでそれをスプレッドシートに入力していきましょう。

以下の関数はGoogle Calendarのeventを受け取って2次元配列に代入していく関数です。参加者の部分などすこしごちゃごちゃしているのでもっといい方法があるかもしれません。こちらのサイトを参考にさせていただきました。
大事な部分はgetID()で取得できるカレンダーの予定に紐づいている予定のidです。予定の削除はこのidをもとに行います。

予定削除用シート↓
image.png

function setEventsToSheet(events, sheetName){
  // 招待されている人の処理
  var arrData = [],guestData=[];
  for (var i = 0; i < events.length; i++){
    guestData = [events[i].getCreators()[0]]
    var guests = events[i].getGuestList();
    for(var j=0;j<guests.length;j++){
      var mail = guests[j].getEmail();
      guestData.push(mail);
    }
    // 1次元配列を作る
    tmpCalendarData = 
      [
        i+1, //No
        events[i].getTitle(), 
        events[i].getStartTime(),
        events[i].getEndTime(),
        "=INDIRECT(\"RC[-1]\",FALSE)-INDIRECT(\"RC[-2]\",FALSE)",//所要時間の計算
        events[i].getLocation(),
        events[i].getId(),
        guestData
      ]
    guestData = []
    arrData.push(tmpCalendarData)
  }
  
  // シートに予定を書き込む
  var sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
  var row_no = sheet.getDataRange().getLastRow();
  var col_no = sheet.getDataRange().getLastColumn();
  sheet.getRange(7,2,row_no,col_no).clearContent();
  
  var rows = arrData.length;
  var cols = arrData[0].length;
  
  sheet.getRange(7,3,rows,cols).setValues(arrData);
}

予定の取得は前回の記事と同じですね。スプレッドシートのE3:F3セルで集計期間を入力してそれをもとにカレンダーの予定を取得します。

function getCalendarEvent(){
  // カレンダーの予定を取得する
  var sheet     = SpreadsheetApp.getActive().getSheetByName('予定削除用シート');
  var idRange   = sheet.getRange(2,3);
  var id        = idRange.getValue();
  var cal       = CalendarApp.getCalendarById(id);
  var dateRange = sheet.getRange("E4:F4");
  var date      = dateRange.getValues();
  var startDate = new Date(date[0][0]);
  var endDate   = new Date(date[0][1]);

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

  if(events.length==0) Browser.msgBox("予定はありません");
  else setEventsToSheet(events, '予定削除用シート'); 
}

予定の一括削除

この記事ではdeleteEventメソッドを使って指定した日付のすべての予定を削除していましたが、今回はイベントに紐づくidをgetEventByIdで取得し、deleteEventメソッドでイベントごとに削除を行います。
予定の確認の際に使用したシートをそのまま使います。
B列の削除フラグがevent[i][0]にあたるのでそれが1の場合のidのイベントを削除しています。

予定削除用シート↓
image.png

function deleteEventById(){
  var sheet       = SpreadsheetApp.getActive().getSheetByName('予定削除用シート');
  var idRange     = sheet.getRange(2,3);
  var id          = idRange.getValue();
  var cal         = CalendarApp.getCalendarById(id);
   
  var LastRow     = sheet.getDataRange().getLastRow();
  var LastCol     = sheet.getDataRange().getLastColumn();
  
  var eventsRange = sheet.getRange(7,2,LasrRow,LastCol);
  var events      = eventsRange.getValues();
  
  var eventId;
  for(var i=0; i<events.length; i++){
    if(events[i][0]==1){ 
      eventId   = events[i][7];
      var event = cal.getEventById(eventId);
      event.deleteEvent();
    }
  }
}

おわりに

Google Calendarの予定を一括で登録・確認・削除を行うことができました。とても便利なのでぜひ使ってみてください!

参考

7
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?