Google Apps Script未更新客户数据却始终修改Ultimo cambio列日期
问题解决:脚本无数据变更时仍更新“Ultimo cambio”列
问题根源
你的脚本每次运行都会触发日期更新,核心原因有两个:
- 'Cliente'列的对比逻辑错误:遍历headers时会先从源文件读取'Cliente'列的值赋值给rowData,之后又用文件名
fileName覆盖该值。对比时现有客户的'Cliente'列值是fileName,和源文件读取的值(可能为空或不一致)不匹配,导致dataUpdated被错误设为true。 - 未处理值类型差异:工作表中的空白值可能是
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; } } }
关键修改说明
- 统一值格式:读取现有客户数据和源文件数据时,将
null转为空字符串,避免类型差异导致的误判; - 提前设置Cliente列:在遍历headers之前就把
rowData[clientIndex]设为fileName,确保后续对比时该列值一致; - 跳过无需对比的列:遍历headers时直接跳过'Cliente'和'Ultimo cambio'列,只校验业务数据列的变更。
内容的提问来源于stack exchange,提问作者Fonch
相关产品推荐
相关产品推荐

