Google App Script自定义函数:遍历日历二维数组获取下一个活动
Google Apps Script自定义函数修复:找到日历中最后一项活动的下一个循环项
原代码的核心问题
- 循环变量不匹配:第一个
for循环初始化week,但循环条件和增量使用未定义的i;第二个循环同理,初始化day却用j,导致循环无法正确执行。 - 语法错误:JavaScript条件判断关键字是小写
if,大写IF会触发语法报错。 - 索引逻辑倒置:获取当前活动在序列中的位置,应使用
alt_activities_range.indexOf(当前活动),而非用活动去查找序列数组的索引。 - 变量拼写错误:
alt_activties_range拼写错误(缺失字母i),正确应为alt_activities_range。 - 返回值错误:原代码返回索引+1的数值,而非对应的活动名称,不符合需求。
修正后的函数代码
/** * 遍历日历数组,找到最近执行的最后一项活动,返回序列中的下一个活动;若为序列末尾则返回第一个活动。 * @param {array} calendar_range 日历数据的二维数组 * @param {array} alt_activities_range 活动序列的一维数组(需提取表1中B到I列的活动) * @return 下一个要执行的活动名称 * @customfunction */ function calendar_search(calendar_range, alt_activities_range) { // 将传入的二维活动范围转换为一维数组(适配表格选中的多行多列范围) const activitySequence = alt_activities_range.flat(); // 从最后一周(最后一行)开始向前遍历 for (let i = calendar_range.length - 1; i >= 0; i--) { const weekRow = calendar_range[i]; // 从每周的最后一天(最后一列)开始向前遍历 for (let j = weekRow.length - 1; j >= 0; j--) { const currentActivity = weekRow[j]; // 跳过空单元格和不在活动序列中的内容 if (!currentActivity) continue; const activityIndex = activitySequence.indexOf(currentActivity); if (activityIndex !== -1) { // 若为序列最后一项则返回第一个,否则返回下一项 return activityIndex === activitySequence.length - 1 ? activitySequence[0] : activitySequence[activityIndex + 1]; } } } // 日历无匹配活动时,默认返回序列第一项(可选逻辑) return activitySequence[0]; }
使用方法
- 定义活动序列:选中表1中B2到I2的活动范围(
Chess至Crossword),给该范围命名为ActivitySequence(可选,方便调用)。 - 调用函数:在表格空白单元格中输入公式:
其中=calendar_search(表2!A2:G5, ActivitySequence)表2!A2:G5是日历的有效数据范围(包含WEEK1到WEEK4的所有单元格)。
根据示例日历数据,最后一项活动是WEEK4 DAY6的Pilates,函数会正确返回其下一项Elevate。
内容的提问来源于stack exchange,提问作者Drew254
相关产品推荐
相关产品推荐

