見出し画像

【GAS】Google Apps Script 活用事例 Googleカレンダーのイベント主催者を自動で変更しよう。

採用管理システムのログインに、*******@会社名.comのような個人のアカウントを使っているのですが、社内の運用ルールで、採用管理ツールで、登録した面接日程を、毎回、手動で、個人のカレンダーから主催者を、エイリアスの人事共有のカレンダーに主催者を変更していて、それを自動化したいと思って、週末もGASをバリバリ書いています。

スクリーンショット 2020-08-22 19.32.49 (1)

エイリアスってのがミソで、採用管理システム側がエイリアスのカレンダーとの同期・連携に対応していないのです。

先に結論からお話すると、採用管理ツールと連動状態を保ったまま、Googleカレンダーの主催者変更をするという事を実現させる事は出来ませんでした。

下記で詳しく解説していますが、Googleカレンダーに予定が登録されると、一意のイベントIDが割り当てられます。おそらく、採用管理ツールは、API連携などで、こうしたツールと同期しているはずなので、イベントIDが変わってしまう、あるいは削除された段階で、連動しなくなってしまうのではないかと考えています。

.......自動化しようにもメソッドがない気がする。

一応、下記のロジックで自動化しようと試みました。

1. 一度自分のカレンダーに登録されている
 イベント時間、内容などを、配列に入れてから削除
2. 配列をシートに書き出し、再度、登録する

上記の方法だと、Googleカレンダーの表面上の登録は問題ありません。しかし、採用管理システムに紐づいているイベントIDが削除によって無くなってしまうはずです。(採用管理ツールだけは、本番環境で試すしかなく、テストはしていません。それやったら、クビになるな.....。)もし、Googleカレンダー単体で、採用スケジュールを管理している場合は、上記の方法で問題ないでしょう。

血眼になって探したのですが、主催者を変更するというメソッドは、ありませんでした。ということは、運用方法を見直すか、ブラウザなどの操作が出来る言語、RubyとかPythonとかで自動化するしかないのかなぁ......と思っています。

基本、Google Driveのファイルを移動する際も、deleteして、addするのが基本です。moveはありそうでない。トリガーの時もそうでした。setして、deleteで、移譲するみたいなコンセプトはありませんでした。

Googleカレンダー単体であればなぁ......この方法で行けるのに.....。

//削除→シートに書き出し→シート経由で登録 だと採用管理システムの連動済みデータが消える

function targetEvents() {
 const calendar       = CalendarApp.getDefaultCalendar();
 
 const date = new Date(); 
 const events = calendar.getEventsForDay(date);
 
 let values  = [];
 
 for (const event of events) {
   
   //イベントタイトルに仮押さえが含まれていれば、削除
   const eventTitle = event.getTitle();
   const startTime  = event.getStartTime();
   const endTime    = event.getEndTime();
   const detail     = event.getDescription();
   const guests     = event.getGuestList();
   
   let guestsArray  = [];
   
   if(eventTitle.indexOf('面接') !== -1){
   
     //メールアドレスを取り出すための記述
     for(const guest of guests){
     
       const accountId = guest.getEmail();
       guestsArray.push(accountId);
     
     }
     //配列を文字列化する
     const guestsList = guestsArray.join();
     values.push([eventTitle, startTime, endTime, guestsList, detail]);
     
     //配列に入れた後、自分のカレンダーからイベントを削除する
     event.deleteEvent();
     
   }//if
 }//for
 console.log(values);
 return values
}//end

function setEvents() {
 const spreadsheet = SpreadsheetApp.openById('*********');
 const sheet       = spreadsheet.getSheetByName('イベント主催者移譲');
 const values      = targetEvents();
 
 sheet.getRange(2, 1, values.length, values[0].length).setValues(values);

}

こんな感じで書き出す事が出来ます。Googleカレンダーの場合は、間違って削除した場合でも、30日間までなら復元できます。

イベントを登録する際は、createEvent(title, startTime, endTime, option)で出来ます。(予定のタイトル、開始時刻、終了時刻、説明や場所などのオプション)で登録する事が出来ます。

スクリーンショット 2020-08-22 19.48.05

割と需要があるかも......特定の文言が含まれている予定を一括で削除する

忙しい役職者の日程を仮押さえして、一時的に作成するスケジュールがあり、それを一括削除するスクリプトを過程で書きました。

function deleteEvent() {
 const calendar = CalendarApp.getDefaultCalendar();
 const date     = new Date(); 
 const events   = calendar.getEventsForDay(date);
 
 for (const event of events) {
   
   //イベントタイトルに仮が含まれていれば、削除
   const eventTitle = event.getTitle();
   if(eventTitle.indexOf('仮') !== -1){
     event.deleteEvent();
     
   }//if
 }//for
}//end

Googleカレンダー関連の自動化は、こちら


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