Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Tomokatsu-Sakamoto/9f62f94b186f060c5fa1b8184ee6d08a to your computer and use it in GitHub Desktop.
Save Tomokatsu-Sakamoto/9f62f94b186f060c5fa1b8184ee6d08a to your computer and use it in GitHub Desktop.
"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