首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >我的记账表格学会了“读心术”,再也不会忘记软件到期了

我的记账表格学会了“读心术”,再也不会忘记软件到期了

原创
作者头像
dsy
发布2025-06-16 09:00:43
发布2025-06-16 09:00:43
730
举报
购买软件记录
购买软件记录

因为自己一直有记账的习惯,对于购买的软件应用会单独记在一张表格上,但是现在的软件一般都是订阅制,每个月或者每年都要续费或取消服务。我通常只在表格中填上到期时间,之后便很容易忘记。如果记账信息能与手机日历联动,那该多方便啊!有了这个想法,马上行动起来,写个提示词问一下ChatGPT。

ChatGPT 小助手的回复
ChatGPT 小助手的回复

综合考虑,使用 Google Apps Script 可以不用自己部署服务器,省钱又方便,最终选择了这个方案,整个思路大致如下:

实现思路
实现思路

实现的脚本如下:

代码语言:js
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档