Google Sheets脚本故障:无法匹配日期并写入预订信息
Google Sheets 脚本问题:无法定位指定日期并写入预订姓名
我用Google表格跟踪预订,每个月对应一个独立工作表,通过表单提交页面收集预订的日、月、年和姓名。
已完成的功能及代码
已经实现以下两步:
- 获取预订姓名(Sheet2的D列)
- 找到对应月份的工作表(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);
剩余需求
- 在对应月份工作表中找到指定日期数字
- 获取该日期下方的单元格
- 写入预订姓名
示例:JB预订了2024年6月12日,在名为June的工作表中,12日位于单元格D8,需要在D9单元格中写入JB。
表格数据示例
Sheet2数据
| Day | Month | Year | Name |
|---|---|---|---|
| 12 | June | 2024 | JB |
June工作表数据
| MONDAY | TUESDAY | WEDNESDAY | THURSDAY | FRIDAY | SATURDAY | SUNDAY |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| HI | ||||||
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
问题现象
运行脚本时,日志持续返回: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 }
问题分析与修正方案
原代码核心错误
findColumnByValue函数逻辑错误:该函数仅遍历指定列(传入参数为1,即第一列)查找日期,但日期分布在工作表的7列(周一至周日)中,因此无法找到非周一的日期。- 后续逻辑偏离需求:原代码尝试查找「今天的日期」,但需求是找到表单提交的指定日期,然后写入其下方单元格,这部分逻辑完全错误。
修正后的完整代码
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; // 未找到 }
修正说明
findDayPosition函数:遍历整个工作表的所有单元格,支持数字和文本类型的日期值,找到后返回其行号和列号。- 核心逻辑调整:找到指定日期的位置后,直接定位到其下一行的同列单元格,写入预订姓名,完全贴合需求。
- 变量名优化:将
course改为name,更符合实际业务含义。
内容的提问来源于stack exchange,提问作者Aidan Wilson
相关产品推荐
相关产品推荐

