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

Google Apps Script未更新客户数据却始终修改Ultimo cambio列日期

问题解决:脚本无数据变更时仍更新“Ultimo cambio”列

问题根源

你的脚本每次运行都会触发日期更新,核心原因有两个:

  1. 'Cliente'列的对比逻辑错误:遍历headers时会先从源文件读取'Cliente'列的值赋值给rowData,之后又用文件名fileName覆盖该值。对比时现有客户的'Cliente'列值是fileName,和源文件读取的值(可能为空或不一致)不匹配,导致dataUpdated被错误设为true。
  2. 未处理值类型差异:工作表中的空白值可能是null,而脚本中初始化的是空字符串'',类型不一致会被判定为数据变更。

修正方案

针对上述问题,调整脚本逻辑:

  • 提前设置'Cliente'列的值为fileName,避免后续覆盖导致的对比错误;
  • 对比数据时跳过'Cliente'列,因为该列由文件名固定生成,无需校验;
  • 统一值的格式,将null/undefined转为空字符串,消除类型差异。

修正后的完整脚本

function importarDatosClientes() {
  const folderId = 'xxxxxxxxxxxxxxxxxxxxxxx';
  const folder = DriveApp.getFolderById(folderId);
  const files = folder.getFilesByType(MimeType.GOOGLE_SHEETS);
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  let clientesSheet = spreadsheet.getSheetByName('Clientes');

  if (!clientesSheet) {
    clientesSheet = spreadsheet.insertSheet('Clientes');
    clientesSheet.appendRow(['Cliente', 'Ultimo cambio', /* Add other headers as necessary */]);
  }

  const headers = clientesSheet.getRange(1, 1, 1, clientesSheet.getLastColumn()).getValues()[0];
  const clientIndex = headers.indexOf('Cliente');
  const lastChangeIndex = headers.indexOf('Ultimo cambio');

  if (clientIndex === -1 || lastChangeIndex === -1) {
    throw new Error("Headers 'Cliente' and/or 'Ultimo cambio' not found in 'Clientes' sheet");
  }

  // Get existing clients
  let existingClients = {};
  if (clientesSheet.getLastRow() > 1) {
    const clientNames = clientesSheet.getRange(2, clientIndex + 1, clientesSheet.getLastRow() - 1).getValues();
    const clientData = clientesSheet.getRange(2, 1, clientesSheet.getLastRow() - 1, clientesSheet.getLastColumn()).getValues();
    clientNames.forEach((name, i) => {
      // 将现有客户的null值转为空字符串,统一格式
      existingClients[name[0]] = clientData[i].map(val => val === null ? '' : val);
    });
  }

  while (files.hasNext()) {
    const file = files.next();
    const fileName = file.getName();

    if (fileName === 'Cliente tipo') {
      continue; // Ignore "Cliente tipo" file
    }

    const clienteSpreadsheet = SpreadsheetApp.openById(file.getId());
    const clienteSheet = clienteSpreadsheet.getSheets()[0];
    const clienteHeaders = clienteSheet.getRange(1, 1, 1, clienteSheet.getLastColumn()).getValues()[0];
    const clienteData = clienteSheet.getRange(2, 1, 1, clienteSheet.getLastColumn()).getValues()[0];
    // 将源数据的null值转为空字符串
    const formattedClienteData = clienteData.map(val => val === null ? '' : val);

    let rowData = new Array(headers.length).fill('');
    let dataUpdated = false;
    // 提前设置Cliente列的值,避免后续覆盖导致对比错误
    rowData[clientIndex] = fileName;

    headers.forEach((header, index) => {
      if (header === 'Ultimo cambio' || header === 'Cliente') { // 跳过无需对比的列
        return;
      }
      const columnIndex = clienteHeaders.indexOf(header);
      const value = columnIndex >= 0 ? formattedClienteData[columnIndex] : '';
      rowData[index] = value;

      // 检查数据是否变更
      if (existingClients[fileName]) {
        const existingValue = existingClients[fileName][index];
        if (existingValue !== value) {
          dataUpdated = true;
        }
      }
    });

    if (existingClients[fileName]) {
      const existingRow = Object.keys(existingClients).indexOf(fileName) + 2;
      if (dataUpdated) {
        rowData[lastChangeIndex] = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'dd/MM/yyyy HH:mm:ss');
        clientesSheet.getRange(existingRow, 1, 1, rowData.length).setValues([rowData]);
      }
    } else {
      // 新客户设置创建时间
      rowData[lastChangeIndex] = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'dd/MM/yyyy HH:mm:ss');
      clientesSheet.appendRow(rowData);
      existingClients[fileName] = rowData;
    }
  }
}

关键修改说明

  1. 统一值格式:读取现有客户数据和源文件数据时,将null转为空字符串,避免类型差异导致的误判;
  2. 提前设置Cliente列:在遍历headers之前就把rowData[clientIndex]设为fileName,确保后续对比时该列值一致;
  3. 跳过无需对比的列:遍历headers时直接跳过'Cliente'和'Ultimo cambio'列,只校验业务数据列的变更。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 09:24:51