見出し画像

【GAS】Google Apps Script 活用事例  カレンダーのちょっとした変更に使えるスクリプト

Googleカレンダーの特定の文言が含まれている予定を一括で処理したい。そんなことありませんか?自分の場合は、仮 とか 調整中 を含んだ予定を一括で書き換えたいと思うことがあったので、こんな感じで書いてみました。こういうのがサッと出来るとつまらない仕事に割く時間が減るので、Goodです。

function renameCalTitle(newDescription){
 const calendar = CalendarApp.getCalendarById('************');
 const startTime = new Date('2021/05/24'); //対象の開始日時
 const endTime   = new Date('2021/06/20'); //対象の終了日時

 const events = calendar.getEvents(startTime, endTime);
 let count    = 0;

 for (const event of events) {

   const title = event.getTitle(); //カレンダーのタイトル

   //新卒 と [調整中]、2つの単語を含む予定のみを対象とする
   if(title.includes('新卒')&& title.includes('[調整中]')){
   console.log(title);
   count += 1;

  //const newTitle = event.getTitle().replace('[調整中]', '[確定]');

   //event.setTitle(newTitle);             //上記の例の場合は、調整中から確定に変更する
   //event.deleteEvent();                  //特定のイベントを削除している時に使用
   //event.setDescription(newDescription); //シートに記載した詳細をつけ加える
   
   }
 }//for
 console.log(`処理対象件数: ${count} 件`);
}

調整中の予定などに、後から参加者を追加する

//後から参加者を追加
const array =  values[i][column.guests].split(',');
console.log(array);
     

for(let j = 0; j < array.length; j++){
 const person = array[j];
 editCalDetail_(values[i][column.id], person);
}
 
 //addGuest一人づつしか登録出来ない。
 //そのため、会議の参加者複数名を後から追加する場合は、for文で回す。
 //event.addGuest(guest);

event.getGuestList()で複数名のメールアドレスを取得できるのに、addGuetsは何でないのだろうかと思うのですが....そういう仕様らしいです。アップデートに期待。

登録した予定をSlackなどで、報告する際にカレンダーを書き出せると改めて便利だなーと思ったので、こちらもシェアしたいと思います。

曜日を返すスクリプトや、出席者を返すスクリプトがすぐに出てこないのですよねー。

カレンダーをシートに書き出すスクリプト

/**
* 実行する関数 setCalEvents
*  
*/

function setCalEvents(){

 //カレンダーの予定を書き出したいシートのURL
 const url     = 'https://docs.google.com/spreadsheets/d/***************';
 const sheet   = getSheetByUrl_(url);
 const lastRow = sheet.getLastRow() + 1;

 console.log(`シート名 ${sheet.getName()}`);
 console.log(`最終行 ${lastRow}`);

 //カレンダーから特定の面接予定のみを取得
 const targetTitle = '22新卒エンジニア2次選考';
 const events = getCalEvent_(targetTitle);
 
 
 //最終行直下に予定を書き出す
 sheet.getRange(lastRow, 2, events.length, events[0].length).setValues(events);

}



/**
* スプレッドシートのURLから、Sheetを取得できる関数
* getSheetByName('シート名') はシート名が変更になるとエラーになってしまうが、
* このスクリプトでは、URLからシートを取得する事ができる。シート名の変更の影響を受けない
* 
* @param  {string} スプレッドシートのURL
* @return {object} シートオブジェクト
*
*/

function getSheetByUrl_(url) {
 const ss      = SpreadsheetApp.openByUrl(url);
 const sheets  = ss.getSheets();
 console.log(url.split('#gid='));

 //シートIDを、文字列から数値に変換する
 const sheetId = Number(url.split('#gid=')[1]);

 //前述のsheetIdが、型も含めて完全一致したときに、sheetをオブジェクトとして返す。
 for (const sheet of sheets) {
   if (sheetId === sheet.getSheetId()) return sheet;
 }//for
}//end



/**
* カレンダーから面接予定を取得する。
* 
*/

function getCalEvent_(targetTitle) {
 const startDate = new Date('2021/04/27');
 const endDate   = new Date('2022/05/20');

 const cal    = CalendarApp.getCalendarById('*****************');
 const events = cal.getEvents(startDate, endDate);
 
 //日付
 const today    = Utilities.formatDate(startDate, 'JST', 'yyyy/MM/dd');
 const tomorrow = Utilities.formatDate(endDate, 'JST', 'yyyy/MM/dd');
 
 console.log(`取得開始日 ${today}、取得終了日 ${tomorrow}`);
 
 let newValues = [];
 let count     = 0;

 for(const event of events){
   
   info = {
     title:  event.getTitle(),
     day:    dayOfTheWeek_(event.getStartTime().getDay()),
     date:   Utilities.formatDate(event.getStartTime(), 'JST', 'MM月dd日'),
     start:  Utilities.formatDate(event.getStartTime(), 'JST', 'HH:mm'),
     end:    Utilities.formatDate(event.getEndTime(), 'JST', 'HH:mm'),
     guests: guestList_(event.getGuestList())
   }
  
  const stringDate = `${info.date}${info.day})`;
  const period     = `${info.start}${info.end}`;
  
   if(info.title.includes(targetTitle)){
     newValues.push([info.title, stringDate, period, '', info.guests]);
     count += 1;
   }
 }//for

 console.log(`カレンダー登録件数 ${count} 件`);
 console.log(newValues);

 return newValues
 
}//end


/**
* 曜日を返す
* 
*/

function dayOfTheWeek_(day) {
 let string;

 switch(day){
   case 0: string = '日';
     break;
   case 1: string = '月';
     break;
   case 2: string = '火';
     break;
   case 3: string = '水';
     break;
   case 4: string = '木';
     break;
   case 5: string = '金';
     break;
   case 6: string = '土';
     break;
 }
 return string
}


/**
* カレンダーの出席者を文字列で返す
* 
*/

function guestList_(guests){
 let array = [];
 for(const guest of guests){
   const accountId = guest.getEmail();
   array.push(accountId);

 }
 //配列を文字列化する
 const guestsList = array.join();
 return guestsList
}

カレンダーのGAS活用事例をまとめたマガジンがありますよ


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