You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 定义活动序列:选中表1中B2到I2的活动范围(Chess至Crossword),给该范围命名为ActivitySequence(可选,方便调用)。
  2. 调用函数:在表格空白单元格中输入公式:
    =calendar_search(表2!A2:G5, ActivitySequence)
    
    其中表2!A2:G5是日历的有效数据范围(包含WEEK1到WEEK4的所有单元格)。

根据示例日历数据,最后一项活动是WEEK4 DAY6的Pilates,函数会正确返回其下一项Elevate。

内容的提问来源于stack exchange,提问作者Drew254

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 11:37:48