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()。 - 错误处理:添加日志输出,方便排查未找到日期的情况。
使用注意事项
- 确认入住表的实际表名,替换代码中的
'Occupancy'。 - 确认入住日期在预订表的列索引(代码中是第3列,索引2),如果实际位置不同,修改
row[2]。 - 确认预订ID要写入的列:AD列是第30列,所以用
getRange(targetRow, 30),如果列不同,修改数字即可。
内容的提问来源于stack exchange,提问作者user123
相关产品推荐
相关产品推荐

