Last active
January 28, 2023 01:17
-
-
Save Tomokatsu-Sakamoto/9f62f94b186f060c5fa1b8184ee6d08a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict"; // 変数の宣言を強要する | |
/** @OnlyCurrentDoc */ // 他のファイルにはアクセスしない | |
const MODE_VERIFICATION = true; // 削除の際に確認を求めるか?(true なら確認を求める) | |
const ERR_MSG01 = 'E01 現在のセルの内容が日付ではないため、処理を中断します...'; | |
function onOpen() { | |
let ui = SpreadsheetApp.getUi(); // Uiクラスを取得する | |
let menu = ui.createMenu('予定の削除'); // Uiクラスからメニューを作成する | |
menu.addItem('削除実行', 'cancelConf'); // メニューにアイテムを追加する | |
menu.addToUi(); // メニューをUiクラスに追加する | |
} | |
function cancelConf() { | |
let sheet = SpreadsheetApp.getActiveSheet(); // 現在開いているスプレッドシート | |
let row = sheet.getActiveRange().getRow(); | |
let column = sheet.getActiveRange().getColumn(); | |
let iCount = 0; | |
// 処理対象となる日付を、現在のアクティブセルから取得 | |
let value = sheet.getRange(row, column).getValue(); | |
if (isDate(value) == false) { // 日付でなければ処理を中断 | |
SpreadsheetApp.getActiveSpreadsheet().toast(ERR_MSG01); | |
return; | |
} | |
// 特定の日に発生するイベントを取得 | |
// https://developers.google.com/apps-script/reference/calendar/calendar-app#geteventsfordaydate | |
let events = CalendarApp.getDefaultCalendar().getEventsForDay(value); | |
for (let i = 0; i < events.length; i++) { | |
let event = events[i]; // 処理対象の予定 | |
let title = event.getTitle(); // 予定のタイトル | |
let startDate = event.getStartTime(); // 予定の開始日時(Date 型) | |
let endDate = event.getEndTime(); // 予定の終了日時(Date 型) | |
let dispDate; // 表示用の予定の期間 | |
let sDate; // 予定の開始日時(文字列) | |
let eDate; // 予定の終了日時(文字列) | |
if (event.isAllDayEvent() == true) { | |
endDate.setDate(endDate.getDate() - 1); // 時間指定でないい予定は、終了が翌日になっているので 1日戻す | |
sDate = Utilities.formatDate(startDate, 'JST', 'yyyy-MM-dd'); | |
eDate = Utilities.formatDate(endDate, 'JST', 'yyyy-MM-dd'); | |
} | |
else { | |
sDate = Utilities.formatDate(startDate, 'JST', 'yyyy-MM-dd HH:mm'); | |
eDate = Utilities.formatDate(endDate, 'JST', 'yyyy-MM-dd HH:mm'); | |
} | |
if (sDate != eDate) { // 表示用の日付文字列を作成 | |
dispDate = sDate + '~' + eDate; | |
} | |
else { | |
dispDate = sDate; | |
} | |
let res = "yes"; | |
if (MODE_VERIFICATION == true) { // プログラムの設定に応じて、予定削除前に確認を行う | |
res = Browser.msgBox('予定の削除確認', `${dispDate} の予定「${title}」を削除してかまいませんか?`, Browser.Buttons.YES_NO); | |
} | |
console.log(i + ' ' + res); | |
console.log(i + ' ' + title); | |
console.log(i + ' ' + startDate); | |
console.log(i + ' ' + endDate); | |
console.log(i + ' ' + dispDate); | |
if (res == 'yes') { | |
event.deleteEvent(); // 予定を削除 | |
iCount++; | |
} | |
} | |
SpreadsheetApp.getActiveSpreadsheet().toast(iCount + '件の予定を削除しました。'); | |
} | |
/** | |
* 指定されたデータが日付かどうかの判定 | |
* 参考: http://pineplanter.moo.jp/non-it-salaryman/2022/04/20/gas-isdate/ | |
*/ | |
function isDate(d) { | |
if (Object.prototype.toString.call(d) == "[object Date]") { | |
return true; | |
} | |
return false; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment