如何在Google表格中通过Apps Script生成短URL并应用于日历事件
如何在Google表格中通过Apps Script生成短URL并应用于日历事件
我完全懂你的需求啦——把Google幻灯片的长URL缩成短链接,再通过Google表格的Apps Script自动放到日历事件里,还不想用额外的第三方API,只用原生工具对吧?这就给你一步步讲怎么实现:
先做好前置准备
- 提前创建好你要用来添加事件的日历
- 打开这个日历的「设置」页面,往下滑找到「日历ID」,复制这个ID
- 回到Google表格的主工作表,把复制的日历ID粘贴到
<Calendar ID>对应的单元格里,同时把日历名称也粘贴到<Calendar Name>的单元格中
第一步:添加生成短URL的函数
先在Apps Script编辑器里加这个函数,它能帮你把长URL转成短链接,用的是Google官方的服务,不用额外API:
function shortenUrl(longUrl) { try { // 调用Google短网址服务(需要先在编辑器中启用该服务) var shortUrl = UrlShortener.Url.insert({longUrl: longUrl}); return shortUrl.id; } catch (e) { // 如果生成失败,就返回原长URL,不影响后续操作 Logger.log("短链接生成失败:" + e.toString()); return longUrl; } }
👉 启用服务的小步骤:打开Apps Script编辑器,点击左侧的「服务」图标(像拼图块),找到「UrlShortener」,点击「添加」就搞定了,这是Google自带的,不用额外申请密钥。
第二步:编写创建日历事件的主函数
这个函数会读取表格里的信息,生成短链接,然后自动创建日历事件,还能帮你清理旧事件:
/* * 前置提示: * 日历必须提前创建完成 * 日历ID和名称要已经填入主工作表的对应单元格 */ function CreateManyEvents() { // 获取当前表格对象 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); // 激活第3张工作表(索引从0开始,所以[2]对应第3张) var targetSheet = spreadsheet.getSheets()[2]; SpreadsheetApp.setActiveSheet(targetSheet); // 先清理旧事件(可选,如果不需要可以注释掉这行) BulkDeleteEventsDelete(); // 读取工作表里的所有数据 var dataRange = targetSheet.getDataRange(); var data = dataRange.getValues(); // 从主工作表获取日历ID,记得把这里的单元格位置改成你自己的 var mainSheet = spreadsheet.getSheetByName("主工作表"); var calendarId = mainSheet.getRange("A1").getValue(); // 假设日历ID在A1单元格 var calendar = CalendarApp.getCalendarById(calendarId); // 遍历每一行数据,创建事件 for (var i = 1; i < data.length; i++) { // 跳过第1行标题行 var eventTitle = data[i][0]; // 假设第1列是事件标题 var eventStart = data[i][1]; // 第2列是开始时间 var eventEnd = data[i][2]; // 第3列是结束时间 var longSlideUrl = data[i][3]; // 第4列是Google幻灯片的长URL // 生成短链接 var shortSlideUrl = shortenUrl(longSlideUrl); // 创建日历事件,把短链接放到描述里(也可以改成位置字段哦) calendar.createEvent(eventTitle, eventStart, eventEnd, { description: "幻灯片链接:" + shortSlideUrl }); } // 弹出提示告诉我们创建完成啦 SpreadsheetApp.getUi().alert("事件创建完成!"); } // 批量删除旧事件的辅助函数 function BulkDeleteEventsDelete() { var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var mainSheet = spreadsheet.getSheetByName("主工作表"); var calendarId = mainSheet.getRange("A1").getValue(); // 对应你的日历ID单元格 var calendar = CalendarApp.getCalendarById(calendarId); // 获取未来30天的所有事件,你可以根据需要调整时间范围 var events = calendar.getEvents(new Date(), new Date(new Date().getTime() + 30*24*60*60*1000)); // 逐个删除事件 for (var j = 0; j < events.length; j++) { events[j].deleteEvent(); } Logger.log("已成功删除" + events.length + "个旧事件"); }
最后调整小细节
- 记得根据你自己表格的列顺序,调整代码里的
data[i][0]、data[i][3]这些索引值(列从左到右是0开始计数哦) - 如果不想删除旧事件,把
BulkDeleteEventsDelete();这行代码注释掉就行(加个//在前面)
备注:内容来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

