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

Google Sheets脚本故障:无法匹配日期并写入预订信息

Google Sheets 脚本问题:无法定位指定日期并写入预订姓名

我用Google表格跟踪预订,每个月对应一个独立工作表,通过表单提交页面收集预订的日、月、年和姓名。

已完成的功能及代码

已经实现以下两步:

  1. 获取预订姓名(Sheet2的D列)
  2. 找到对应月份的工作表(Sheet2的B列)

代码如下:

var currentRow = sheet2.getLastRow();
var day = sheet2.getRange(currentRow, 1).getValue();
var month = sheet2.getRange(currentRow, 2).getValue();
var course = sheet2.getRange(currentRow, 4).getValue();

var monthSheet = spreadsheet.getSheetByName(month);

剩余需求

  1. 在对应月份工作表中找到指定日期数字
  2. 获取该日期下方的单元格
  3. 写入预订姓名

示例:JB预订了2024年6月12日,在名为June的工作表中,12日位于单元格D8,需要在D9单元格中写入JB。

表格数据示例

Sheet2数据

DayMonthYearName
12June2024JB

June工作表数据

MONDAYTUESDAYWEDNESDAYTHURSDAYFRIDAYSATURDAYSUNDAY
12
3456789
10111213141516
17181920212223
HI
24252627282930

问题现象

运行脚本时,日志持续返回:Could not find the specified day (12) in the June sheet

当前错误代码

剩余功能的实现代码(存在多处错误):

if (monthSheet) {
      // Find the day in the selected month sheet
      var dayColumn = findColumnByValue(monthSheet, 1, day)

      if (dayColumn !== -1) {
        // Input data into the cell below the specified day
        var today = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyy-MM-dd');
        var dateRow = monthSheet.getRange(2, dayColumn, monthSheet.getLastRow() - 1, 1).getValues();
        var rowIndex = dateRow.flat().indexOf(today) + 2;

        if (rowIndex !== -1) {
          // Input data into the cell below the specified day
          monthSheet.getRange(rowIndex, dayColumn).setValue(course);

          Logger.log('Data input successful on ' + today + ' for ' + day + ' in ' + month + '.');
        } else {
          Logger.log("Could not find today's date (" + today + ') in the ' + month + ' sheet.');
        }
      } else {
        Logger.log("Could not find the specified day (" + day + ') in the ' + month + ' sheet.');
      }
    } else {
      Logger.log("Could not find the sheet for the specified month (" + month + ').');
    }
  } catch (e) {
    Logger.log('An error occurred: ' + e);
  }
}

function findColumnByValue(sheet, column, value) {
  var data = sheet.getRange(1, column, sheet.getLastRow(), 1).getValues();
  for (var i = 0; i < data.length; i++) {
    if (data[i][0] === value) {
      return i + 1;
    }
  }
  return -1; // Not found
}

问题分析与修正方案

原代码核心错误

  1. findColumnByValue函数逻辑错误:该函数仅遍历指定列(传入参数为1,即第一列)查找日期,但日期分布在工作表的7列(周一至周日)中,因此无法找到非周一的日期。
  2. 后续逻辑偏离需求:原代码尝试查找「今天的日期」,但需求是找到表单提交的指定日期,然后写入其下方单元格,这部分逻辑完全错误。

修正后的完整代码

function processBooking() {
  try {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var sheet2 = spreadsheet.getSheetByName("Sheet2");
    
    var currentRow = sheet2.getLastRow();
    var day = sheet2.getRange(currentRow, 1).getValue();
    var month = sheet2.getRange(currentRow, 2).getValue();
    var name = sheet2.getRange(currentRow, 4).getValue(); // 变量名优化为更贴合业务的name

    var monthSheet = spreadsheet.getSheetByName(month);
    
    if (monthSheet) {
      // 查找指定日期在月份工作表中的位置
      var datePosition = findDayPosition(monthSheet, day);
      
      if (datePosition) {
        var targetRow = datePosition.row + 1;
        var targetColumn = datePosition.column;
        
        // 写入预订姓名
        monthSheet.getRange(targetRow, targetColumn).setValue(name);
        Logger.log('预订姓名已成功写入:' + name + ',位置:' + monthSheet.getRange(targetRow, targetColumn).getA1Notation());
      } else {
        Logger.log("在" + month + "工作表中未找到指定日期:" + day);
      }
    } else {
      Logger.log("未找到对应月份的工作表:" + month);
    }
  } catch (e) {
    Logger.log('发生错误:' + e);
  }
}

// 遍历整个工作表,查找指定日期的行和列
function findDayPosition(sheet, targetDay) {
  var data = sheet.getDataRange().getValues();
  
  for (var row = 0; row < data.length; row++) {
    for (var col = 0; col < data[row].length; col++) {
      // 兼容数字和文本类型的日期值
      var cellValue = data[row][col];
      if (typeof cellValue === 'number' && cellValue === targetDay) {
        return {
          row: row + 1, // 转换为表格的行号(从1开始)
          column: col + 1 // 转换为表格的列号(从1开始)
        };
      } else if (typeof cellValue === 'string') {
        var numValue = parseInt(cellValue);
        if (!isNaN(numValue) && numValue === targetDay) {
          return {
            row: row + 1,
            column: col + 1
          };
        }
      }
    }
  }
  return null; // 未找到
}

修正说明

  1. findDayPosition函数:遍历整个工作表的所有单元格,支持数字和文本类型的日期值,找到后返回其行号和列号。
  2. 核心逻辑调整:找到指定日期的位置后,直接定位到其下一行的同列单元格,写入预订姓名,完全贴合需求。
  3. 变量名优化:将course改为name,更符合实际业务含义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:18:11