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

Google Apps Script实现预订ID按入住日期同步至入住表求助

问题分析与修复方案

现有代码的核心问题

  • 目标表指向错误:你用SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()获取当前活动表,但应该直接打开指定的入住表,避免依赖当前打开的表。
  • 数据范围选取错误:getRange(startRow, 2, numRows, numColumns)从第2列开始取数据,但预订ID在原表第1列,导致你取到的data[i][0]不是预订ID。
  • 单元格赋值方法错误:setValues()需要传入二维数组,单个值应该用setValue()。
  • 未实现日期匹配逻辑:代码硬写写入AD2,没有根据入住日期找到对应单元格。

修复后的完整代码

function updateOccupancySheet() {
  // 打开预订表和入住表
  const bookingSheet = SpreadsheetApp.openById('1hoXhPAHOovXvcLQED5aFTQIUnTr4SC6JvyC2na3Npu8').getSheetByName('RS1');
  const occupancySheet = SpreadsheetApp.openById('1nTKL17Vgmx5gVsBcePHcmF_6ecfDswP3MS7NhXRSo-M').getSheetByName('Occupancy'); // 替换为入住表的实际表名

  // 获取预订表数据(从第2行开始,跳过表头)
  const bookingData = bookingSheet.getRange(2, 1, bookingSheet.getLastRow() - 1, bookingSheet.getLastColumn()).getValues();

  // 获取入住表的日期列数据(假设日期在第1列,表头为"date")
  const dateColumn = occupancySheet.getRange(1, 1, occupancySheet.getLastRow(), 1).getValues();
  // 创建日期到行号的映射,方便快速查找
  const dateRowMap = {};
  dateColumn.forEach((row, index) => {
    if (row[0] instanceof Date) {
      // 将日期转为字符串作为键,避免日期对象的精度问题
      const dateStr = Utilities.formatDate(row[0], SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone(), 'MM/dd/yy');
      dateRowMap[dateStr] = index + 1; // 行号从1开始
    }
  });

  // 遍历所有预订数据
  bookingData.forEach(row => {
    const resId = row[0]; // 预订ID在第1列
    const checkInDate = row[2]; // 入住日期在第3列(索引从0开始)
    const bookingStatus = row[5]; // 预订状态在第6列

    // 仅处理已确认的预订
    if (bookingStatus === 'Confirmed' && checkInDate instanceof Date) {
      const checkInStr = Utilities.formatDate(checkInDate, SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone(), 'MM/dd/yy');
      const targetRow = dateRowMap[checkInStr];

      if (targetRow) {
        // 假设预订ID要写入对应日期行的AD列(第30列)
        occupancySheet.getRange(targetRow, 30).setValue(resId);
      } else {
        console.log(`未找到入住日期:${checkInStr} 对应的行`);
      }
    }
  });
}

关键修复点说明

  • 明确指定目标表:直接用表ID打开预订表和入住表,避免依赖当前活动表。
  • 修正数据范围:从第1列开始获取预订表数据,确保能拿到正确的预订ID。
  • 日期匹配逻辑:将入住表的日期列转为字符串映射,快速找到对应行号,避免循环查找的低效。
  • 正确赋值方法:用setValue()写入单个预订ID,而非setValues()。
  • 错误处理:添加日志输出,方便排查未找到日期的情况。

使用注意事项

  1. 确认入住表的实际表名,替换代码中的'Occupancy'。
  2. 确认入住日期在预订表的列索引(代码中是第3列,索引2),如果实际位置不同,修改row[2]。
  3. 确认预订ID要写入的列:AD列是第30列,所以用getRange(targetRow, 30),如果列不同,修改数字即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 08:08:39