因为自己一直有记账的习惯,对于购买的软件应用会单独记在一张表格上,但是现在的软件一般都是订阅制,每个月或者每年都要续费或取消服务。我通常只在表格中填上到期时间,之后便很容易忘记。如果记账信息能与手机日历联动,那该多方便啊!有了这个想法,马上行动起来,写个提示词问一下ChatGPT。
综合考虑,使用 Google Apps Script 可以不用自己部署服务器,省钱又方便,最终选择了这个方案,整个思路大致如下:
实现的脚本如下:
function syncExpirationsToCalendar() {
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheets = spreadsheet.getSheets(); // 获取所有 sheet 页面
const calendar = CalendarApp.getDefaultCalendar(); // 可替换为指定日历
const existingEvents = calendar.getEvents(new Date(), new Date("2100-01-01"));
for (let s = 0; s < sheets.length; s++) {
const sheet = sheets[s];
const data = sheet.getDataRange().getValues();
for (let i = 1; i < data.length; i++) {
const software = data[i][0];
const expiryRaw = data[i][2];
const purchaseRaw = data[i][3];
// 跳过空值或格式异常
if (!software || !expiryRaw) continue;
Logger.log(software); // 输出软件名
Logger.log(expiryRaw);
Logger.log(purchaseRaw);
const expiryDate = new Date(expiryRaw);
expiryDate.setHours(11, 0, 0, 0);
const purchaseDate = new Date(purchaseRaw);
if (isNaN(expiryDate.getTime())) continue;
if (expiryDate <= new Date()) continue;
const title = `软件到期提醒: ${software}`;
const alreadyExists = existingEvents.some(e => {
return(e.getTitle() === title && e.getStartTime().getTime() === expiryDate.getTime());});
Logger.log(alreadyExists);
if (!alreadyExists) {
const expiryEnd = new Date(expiryDate);
expiryEnd.setHours(11, 30);
const reminderDate = new Date(expiryDate);
reminderDate.setDate(reminderDate.getDate() - 3);
reminderDate.setHours(11, 0, 0, 0); // 设置为中午11点
const endReminderDate = new Date(reminderDate);
endReminderDate.setHours(11, 30); // 提醒持续半小时
// 提前三天建事件(提醒)
calendar.createEvent(`提前提醒: ${software}`, reminderDate, endReminderDate, {
description: `软件 ${software} 将于 ${expiryDate.toDateString()} 到期`,
});
// 到期日事件
// calendar.createAllDayEvent(`到期: ${software}`, expiryDate, {
// description: `软件 ${software} 今日到期`,
// });
calendar.createEvent(title, expiryDate, expiryEnd, {
description: `软件 ${software} 到期(来自 sheet: ${sheet.getName()})`,
reminders: [{method: "popup", minutes: 3 * 24 * 60}],
});
}
}
}
}
最后的效果
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。