javascript - 使用 Apps 脚本将重复行替换为 Google 表格中的新数据
问题描述
所以,情况是这样的。我有一张表从我的 WooCommerce 商店中提取一些数据。它每小时获取所有订单的详细信息并保存它们。
现在,当我的商店中的订单状态发生变化时,将在工作表中添加一个具有相同订单 ID 的新行,我想用这个新行替换工作表中的旧行。我四处寻找以寻找删除重复项并找到以下功能。这是可行的,但问题是它删除了新行并保留了现有行。但我想删除现有的并保留新的。我想根据工作表第 15 个索引中的订单 ID 检查重复项。
function removeDuplicates() {
var sheet = SpreadsheetApp.getActive().getSheetByName("Orders");
var data = sheet.getDataRange().getValues();
var newData = [];
for (var i in data) {
var row = data[i];
var duplicate = false;
for (var j in newData) {
if(row[15] == newData[j][15]){
duplicate = true;
}
}
if (!duplicate) {
newData.push(row);
}
}
sheet.clearContents();
sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}
任何帮助将非常感激。谢谢。
解决方案
解释:
您的代码从第一行开始扫描,直到到达数据的最后一行。所有唯一项都存储在newData
数组中。当它多次遇到同一个项目时,它会简单地忽略它,因为它已经被添加到数组中。
您的目标是保持 新记录。后者应由日期列定义。因此,在执行 for 循环之前,您可以按日期降序sort
排列数组;那就是保留新记录(第一次出现)并忽略所有其他您不想要的重复项。例如,如果B 列是日期/日期时间列,指示添加记录的时间,您可以像这样简单地对数据进行排序:
sheet.getDataRange().sort({column: 2, ascending: false}) // replace 2 with your date column
解决方案:
function removeDuplicates() {
var sheet = SpreadsheetApp.getActive().getSheetByName("Orders");
var data = sheet.getDataRange().getValues();
sheet.getDataRange().sort({column: 2, ascending: false}) // replace 2 with your date column
var newData = [];
for (var i in data) {
var row = data[i];
var duplicate = false;
for (var j in newData) {
if(row[15] == newData[j][15]){
duplicate = true;
}
}
if (!duplicate) {
newData.push(row);
}
}
sheet.clearContents();
sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}
推荐阅读
- javascript - 中断 JavaScript 后返回项目
- python - 检查数字是否为素数的最佳方法?
- mysql - 在Mysql中选择具有多个WHERE子句的行
- python - 如何从图像中裁剪轮廓部分(超过 1 个)并为颜色直方图选择水平部分
- python - file.py 运行但 file.exe 不运行
- ansible - Ansible 中的变量替换
- sql - SQL Counting Rows by Identifier Cust_ID:我需要计算具有 2 个条件的行。太极数据
- angular - Angular - 页面重新加载后,来自 sharedService 的 BehaviorSubject 在组件中为空
- python - Python:BeautifulSoup 用 FindAll 获取所有文本数据
- django - Djoser 权限类问题