谷歌表格Apps Script中如何拆分字符串提取日历事件ID
从谷歌表格HYPERLINK公式中提取日历事件ID的正确实现
原有代码的核心偏差
- 读取单元格时使用
getValue()方法,拿到的是HYPERLINK公式计算后显示的静态文本"View Invite",无法获取公式本身包含的链接编码内容 - 提取逻辑没有关联实际单元格的公式内容,反而对预先写死的前缀字符串做分割,根本无法定位到URL中的base64编码段
- 忽略了谷歌日历生成的链接使用URL安全版Base64编码,直接套用标准解码逻辑会出现字符匹配错误
正确实现流程
- 读取单元格内的原始公式字符串
需改用getFormula()方法获取单元格内完整的HYPERLINK公式文本,而非公式渲染后的显示值 - 定位base64编码段的位置
以固定的日历编辑链接前缀为起点,向后搜索第一个双引号的位置,两个位置之间的内容即为待解码的base64串 - 适配URL安全Base64解码规则
谷歌链接中的Base64会将标准编码的+替换为-、/替换为_,解码前需替换回标准编码格式,同时补全解码需要的长度对齐填充 - 从解码结果中拆分出事件ID
解码完成的内容会以换行/空格分隔事件ID与日历ID,取第一个字段即为目标事件ID
可直接运行的Apps Script代码
const targetSheet = sheet; const targetRowIndex = index; const targetCol = 13; // 获取单元格内的原始HYPERLINK公式 const cellFormula = targetSheet.getRange(targetRowIndex, targetCol).getFormula(); const fixedLinkPrefix = '=HYPERLINK("https://www.google.com/calendar/u/0/r/eventedit/'; // 校验单元格是否为目标格式的公式 if (!cellFormula.startsWith(fixedLinkPrefix)) { Logger.log('当前单元格非目标邀请链接格式'); return; } // 提取base64编码段 const encodedSegmentStart = fixedLinkPrefix.length; const encodedSegmentEnd = cellFormula.indexOf('"', encodedSegmentStart); const rawEncodedStr = cellFormula.slice(encodedSegmentStart, encodedSegmentEnd); // 适配URL安全Base64格式 const standardEncodedStr = rawEncodedStr.replace(/-/g, '+').replace(/_/g, '/'); // 补全Base64解码需要的长度填充 const paddedEncodedStr = standardEncodedStr.padEnd( Math.ceil(standardEncodedStr.length / 4) * 4, '=' ); // 解码并提取事件ID const decodedResult = Utilities.newBlob(Utilities.base64Decode(paddedEncodedStr)).getDataAsString(); const extractedEventId = decodedResult.split(/[\n\s]/)[0]; Logger.log(`成功提取事件ID:${extractedEventId}`);
内容的提问来源于stack exchange,提问作者usernametaken
相关产品推荐
相关产品推荐

