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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:03:30