Google Sheets Apps Script日期比较问题:筛选逾期客户同步到未付账单表
修正后可运行的完整代码
function Neplacena2Novi() { const ss = SpreadsheetApp.getActiveSpreadsheet(); // 对应三个工作表,保留你原来的表名 const customerSheet = ss.getSheetByName("Podaci o polaznicima"); // 客户信息表 const paySheet = ss.getSheetByName("Uplate novoupisani"); // 付款记录表 const targetSheet = ss.getSheetByName("Neplaceni racuni"); // 未付账单目标表 // 获取你定义的命名范围:二期款支付日期列 const secondPayRange = ss.getRangeByName("Druga rata"); const startRow = 3; // 你原来定义的起始行,数据从第3行开始 const maxRow = paySheet.getLastRow(); // 取付款表的最后有数据的行 const today = new Date(); today.setHours(0, 0, 0, 0); // 去掉时分秒,避免时间部分影响天数计算 const DAY_MS = 1000 * 60 * 60 * 24; // 一天的毫秒数 const matchData = []; // 存储符合条件的客户数据 // 遍历所有付款记录行 for (let i = startRow; i <= maxRow; i++) { // 获取当前行的二期款支付日期 const secondPayDate = secondPayRange.getCell(i, 1).getValue(); // 跳过没有填二期款日期的行 if (!secondPayDate) continue; // 统一日期格式去掉时分秒 const payDate = new Date(secondPayDate); payDate.setHours(0, 0, 0, 0); // 计算今天和二期款支付日期的差值,单位天 const diffDays = Math.floor((today - payDate) / DAY_MS); // 符合大于45天的条件,取对应行的客户信息(ID、姓名、邮箱、联系方式共4列) if (diffDays > 45) { const customerInfo = customerSheet.getRange(i, 1, 1, 4).getValues()[0]; matchData.push(customerInfo); } } // 写入目标表前先清空原有数据,避免旧数据干扰 const targetStartRow = 3; // 目标表从第3行开始写,和你原来的设置一致 if(targetSheet.getLastRow() >= targetStartRow) { targetSheet.getRange(targetStartRow, 1, targetSheet.getLastRow() - targetStartRow + 1, 4).clearContent(); } // 有符合条件的数据才写入 if (matchData.length > 0) { targetSheet.getRange(targetStartRow, 1, matchData.length, 4).setValues(matchData); } // 保留你原来的提示 const ui = SpreadsheetApp.getUi(); ui.alert("Odredili ste lica koja treba da se pozovu."); } function DugmeDodajKlijenta (){ const ui = SpreadsheetApp.getUi(); // 你可以在这里补充添加客户的逻辑 }
核心修改说明
- 修复了原代码的语法错误:包括for循环格式错误、冗余的嵌套函数定义、括号不匹配问题,解决代码无法执行的问题
- 调整了日期计算逻辑:使用
new Date()获取当前日期,换算成和二期款日期的天数差,实现你要的「今日日期减去二期款支付日期大于45天」的判断条件 - 优化了数据对应逻辑:默认付款表和客户信息表的同一行对应同一个客户的信息,你可以根据实际数据的行对应规则调整startRow参数
- 优化了写入逻辑:只收集符合条件的客户数据再批量写入,写入前先清空目标表原有旧数据,避免冗余数据
注意事项
如果你的客户信息表和付款表的行不是一一对应的,需要先通过客户ID做关联匹配再取值,你可以根据实际数据结构调整对应部分的逻辑。
内容的提问来源于stack exchange,提问作者Tatjana
相关产品推荐
相关产品推荐

