带颜色自定义的日历事件创建脚本优化咨询
优化Google Apps Script日历事件颜色设置性能
你当前的脚本功能正常,但颜色配置读取和判断部分存在性能浪费,完全可以通过批量读取数据+对象映射来优化,以下是优化后的代码及说明:
优化后代码
function CreateSelectionToCalendar() { const ss = SpreadsheetApp.getActiveSpreadsheet(); // 读取help_sheet数据 const sheetHelp = ss.getSheetByName('help_sheet'); const CalendarID = sheetHelp.getRange(1,1).getValue(); const cal = CalendarApp.getCalendarById(CalendarID); // 一次性读取所有颜色配置(第2行到第12行,第1列),构建映射对象 const colorValues = sheetHelp.getRange(2, 1, 11, 1).getValues().flat(); const colorMap = { [colorValues[0]]: '1', // 淡蓝 [colorValues[1]]: '2', // 淡绿 [colorValues[2]]: '3', // 淡紫 [colorValues[3]]: '4', // 淡红 [colorValues[4]]: '5', // 黄色 [colorValues[5]]: '6', // 橙色 [colorValues[6]]: '7', // 青色 [colorValues[7]]: '8', // 灰色 [colorValues[8]]: '9', // 蓝色 [colorValues[9]]: '10', // 绿色 [colorValues[10]]: '11' // 红色 }; // 读取data_sheet数据 const sheetData = ss.getSheetByName('data_sheet'); const rows = sheetData.getDataRange().getValues(); rows.shift(); // 移除表头 rows.forEach((row, i) => { if(row[0]) { Logger.log(JSON.stringify(row)); const type = row[1]; const title = row[2]; const tstart = row[3]; const tstop = row[4]; // const eventID = row[7]; // 当前代码未用到,可保留或删除 const newEvent = cal.createEvent(title, tstart, tstop); // 通过映射对象直接获取颜色代码,替代冗长的else if const colorCode = colorMap[type]; if (colorCode) { newEvent.setColor(colorCode); } } }); }
关键优化点
- 减少服务器交互次数:原脚本在循环内反复调用
getRange读取单个单元格,每次调用都需要和谷歌服务器通信,非常影响性能。优化后一次性读取所有颜色配置,只需要1次服务器请求。 - 用对象映射替代条件判断:将颜色名称和对应的代码存入对象,通过键值对直接查找,替代了11层的
else if判断,代码更简洁,查找效率更高。 - 代码结构更清晰:把配置读取和业务逻辑分离,所有初始化操作都放在循环外部,避免重复执行。
内容的提问来源于stack exchange,提问作者Tien
相关产品推荐
相关产品推荐

