如何修改Google Apps Script实现删除Google Sheets对应行?
修改Google Sheets脚本:将标记取消改为删除对应行
你需要修改脚本中“检查已取消的预订”部分的逻辑,核心是倒序删除行(避免正序删除时行号偏移导致漏删或误删),替换原来的标记操作。
关键修改部分
把原来的标记代码:
// 检查已取消的预订 const newCodes = newData.slice(1).map(row => row[0]); for (let i = 0; i < existingCodes.length; i++) { if (!newCodes.includes(existingCodes[i])) { sheet.getRange(i + 2, 2).setValue("Canceled"); updatedRowCount++; } }
替换为删除行的逻辑:
// 检查已取消的预订并删除对应行 const newCodes = newData.slice(1).map(row => row[0]); const rowsToDelete = []; // 先收集所有需要删除的行号(行号从2开始,因为第1行是表头) for (let i = 0; i < existingCodes.length; i++) { if (!newCodes.includes(existingCodes[i])) { rowsToDelete.push(i + 2); // 记录原始行号 updatedRowCount++; } } // 倒序删除行,避免行号偏移问题 for (let j = rowsToDelete.length - 1; j >= 0; j--) { sheet.deleteRows(rowsToDelete[j]); }
修改后的完整函数
function appendNewReservations(sheet, newData) { if (newData.length <= 1) { return 0; // 若仅存在表头行或无数据则返回0 } const existingData = sheet.getDataRange().getValues(); const existingCodes = existingData.slice(1).map(row => row[0]); let updatedRowCount = 0; for (let i = 1; i < newData.length; i++) { const row = newData[i]; const confirmationCode = row[0]; // 将日期字符串转换为Date对象 row[7] = parseDate(row[7]); row[8] = parseDate(row[8]); if (!existingCodes.includes(confirmationCode)) { // 新增预订,追加行 sheet.appendRow(row); updatedRowCount++; } else { // 已有预订,更新所有字段 const existingIndex = existingCodes.indexOf(confirmationCode); const rangeToUpdate = sheet.getRange(existingIndex + 2, 1, 1, 13); // A至M列 rangeToUpdate.setValues([row.slice(0, 13)]); // 用新数据更新所有字段 updatedRowCount++; } } // 检查已取消的预订并删除对应行 const newCodes = newData.slice(1).map(row => row[0]); const rowsToDelete = []; // 先收集所有需要删除的行号(行号从2开始,因为第1行是表头) for (let i = 0; i < existingCodes.length; i++) { if (!newCodes.includes(existingCodes[i])) { rowsToDelete.push(i + 2); // 记录原始行号 updatedRowCount++; } } // 倒序删除行,避免行号偏移问题 for (let j = rowsToDelete.length - 1; j >= 0; j--) { sheet.deleteRows(rowsToDelete[j]); } // 按开始日期排序表格(从旧到新) sortSheetByStartDate(sheet); // 设置H列和I列的日期格式 const dateRange = sheet.getRange(2, 8, sheet.getLastRow() - 1, 2); dateRange.setNumberFormat('dd / mm / yyyy'); return updatedRowCount; }
核心说明
- 先收集行号再倒序删除:如果正序删除行,删除前面的行后,后面的行会自动上移,导致后续行号对应错误。倒序删除可以完全避免这个问题。
- 行号计算逻辑:
i + 2是因为existingCodes对应表格中从第2行开始的数据(索引0对应表格第2行),表格行号从1开始,表头占第1行。 - 计数保持一致:保留原有的
updatedRowCount计数逻辑,每确认一个要删除的行就累加一次,和之前标记操作的计数规则统一。
内容的提问来源于stack exchange,提问作者Luca Frank Guarini
相关产品推荐
相关产品推荐

