仕事で、
定期的な
繰り返しの
この
自動でずらすまでは
作成したGAS
const calendarId = 'your_carender_id'; const sheetName = "シート1" //期間を指定する const startDate = new Date('2023/01/01 00:00:00'); //取得開始日 const endDate = new Date('2024/01/01 00:00:00'); //取得終了日 // 独自で定義したい祝日 const myCustomHolidays = [{month: 12, day: 29}, {month: 12, day: 30}, {month: 12, day: 31}, {month: 1, day: 2}, {month: 1, day: 3}, {month: 1, day: 4}]; // 検索時のフィルターに利用するキーワード const keyword = 'your_keyword'; /* 指定期間のイベントを取得する */ function getEvents() { // Add query parameters in optionalArgs const optionalArgs = { timeMin: startDate.toISOString(), timeMax: endDate.toISOString(), showDeleted: false, singleEvents: true, maxResults: 1000, orderBy: 'startTime' // use other optional query parameter here as needed. }; // call Events.list method to list the calendar events using calendarId optional query parameter const response = Calendar.Events.list(calendarId, optionalArgs); const events = response.items; //対象オブジェクト毎の指定期間内の予定を取得 const values = []; values.push([ 'No', 'タイトル', '開始時刻', '終了時刻', '休日判定', 'URL' ]); //シートを取得 let no = 1; //No for(const event of events){ // キーワードを含まない予定の場合は、スプレッドシートへの書き出しをスキップ if(!event['summary'].includes(keyword)) continue; const record = [ no++, event['summary'], _getDateTimeInEvent(event, true), _getDateTimeInEvent(event, false), _isBusinessDay(new Date(_getDateTimeInEvent(event, true))) ? '平日' : '休日', _getCalenderEditUrlFrom(event['htmlLink']) ]; values.push(record); } SpreadsheetApp.getActiveSheet().getRange(1, 1, values.length, values[0].length).setValues(values); } function _getDateTimeInEvent(event, isStart) { let startOrEnd = isStart ? 'start' : 'end'; let result = event[startOrEnd]['dateTime']; if(!result) { // endのdateも未定義であれば、ブランクを設定 result = event[startOrEnd]['date'] ?? ''; } return result; } function _getCalenderEditUrlFrom(htmlLink) { return htmlLink.replace('https://www.google.com/calendar/event?eid=', 'https://calendar.google.com/calendar/u/0/r/eventedit/'); } function _isBusinessDay(date) { console.log(date); /* 土日判定 */ if (date.getDay() % 6 === 0) return false; /* 祝日判定 */ let calendar = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com'); let holidays = calendar.getEventsForDay(date); if (holidays.length > 0) return false; /* 独自のおやすみ */ let month = date.getMonth() + 1; let day = date.getDate(); for (var i = 0; i < myCustomHolidays.length; i++) { if (myCustomHolidays[i].month === month && myCustomHolidays[i].day === day) return false; } return true; }
使い方
Googleスプレッドシートを
calendarId
予定取得先のGoogle Carender IDを 設定します。
デフォルトであれば、自分自身の メールアドレスが Carender IDに なります。 sheetName
予定の書き出し先となる Googleスプレッドシートの シート名を 入力します。 startDateと、
endDate
取得する予定の 開始日と 終了日を 指定してください。
指定をしない、もしくは、 遠い 未来日付の 場合も、 1000件までしか 取得できません。 keyword
取得したい予定の 件名に 含まれる 文字列を 指定します。
ブランクの場合は、 全件取得と なります。
パラメーターの
後は、
スプレッドシートの 値の 補足説明
休日、
平日判定に ついて
休日、平日の 判定は、 予定の 開始日を 基準に 判定しています。
祝日は、Googleの 日本の 祝日カレンダー ja.japanese#holiday@group.v.calendar.google.com
から取得しています。
休日の場合には、 休日
が、平日の 場合は、 平日
がE列に 記載されます。 F列に
ついて
F列には、対象行の 予定の 編集URLが 記載されます。
Google Calender API の戻り値には、 編集URLは 含まれなかったので、 参照URLリンクを 置換して 編集して URLに しています。
URLの置換は、 _getCalenderEditUrlFrom
関数で行っています。 カレンダーの
設定日付に ついて
予定の登録の 仕方で、 date
属性、dateTime
属性のどちらか 一方に しか 値が 登録されない ケースが あったので、 dateTime
優先で値の 取得を 行うようにしました。
参考
スクリプトの
以上です。
コメント