if-statement - Google Script App删除Google工作表中特定列中具有特定值的重复行
问题描述
我有一个谷歌表,人们在其中提交他们正在处理的任务,他们将提交一个状态更新,比如说任务 A,它要么是“进行中”,要么是“完成”。任务 A 在 D[4] 列中,状态是在 E[5] 列中。我试图让此代码仅在存在状态为“完成”的重复任务 A 时删除任务 A 的“进行中”行。这适用于识别重复并按顺序删除重复的行,但我不确定如何让它在有“任务 A”“完成”行时只删除重复的“任务 A”“进行中”行。任何帮助将非常感激!
function removeDuplicates() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
var data = sheet.getDataRange().getValues();
var newData = [];
for (i in data) {
var row = data[i];
var duplicate = false;
for (j in newData) {
if(row[3] == newData[j][3]){
duplicate = true;
}
}
if (!duplicate) {
newData.push(row);
}
}
sheet.clearContents();
sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}
解决方案
我会尝试
function removeDuplicates()
{
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("test");
var dataRange = sheet.getDataRange();
var data = dataRange.getValues();
var indexOfStatusColumn = 4;
var newData = [];
data.forEach(function (row, rowI){
var isDuplicate = false
if (newData.length)
newData.forEach(function (dup, dupI)
{
if (dup[3] == row[3])
{
if (row[indexOfStatusColumn] == "Complete" && dup[indexOfStatusColumn] != "Complete")
newData[dupI][indexOfStatusColumn] = "Complete";
isDuplicate = true;
return (false);
}
})
if (!isDuplicate)
newData.push(row);
});
dataRange = sheet.getRange(2, 1, dataRange.getLastRow() - 1, dataRange.getLastColumn());
dataRange.clearContent();
sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}
一些事情
- 我使用
forEach()
循环它更有效 - 通过返回来打破循环
false
以避免解析所有newData
无用的槽 - 当我找到重复项时,我会执行其中一些操作
- 检查是否重复
Complete
打开,如果是data
,则不打开newData
- 将值更改
newData
为“完成”,这样它将保持完整状态(如果两行上的数据不同,则可能会扭曲数据,请小心)。
- 检查是否重复
- 也使用
clearContent()
from a range 来避免删除工作表的所有内容,但只删除其中的特定部分。在这里,我重建了它以保留标题
参考
推荐阅读
- php - 尝试通过在 PHP 上添加 1 天来更新日期字段
- macros - Common Lisp Read Macro for "lazy infix or" 来解构关键字
- javascript - 如何隐藏标签并在多个工作表中保护它们(谷歌表格)
- swift - 快速检查核心数据对象是否都满足一个谓词
- c - 使用 LD_PRELOAD 跟踪 malloc 分配/释放
- regex - 字符串末尾的匹配年份未括在括号中
- amazon-web-services - 使用 AWS API Gateway 和 Lambda,我看到的路径都以 $default 为前缀
- powershell - 对 Azure 存储表运行查询返回 403 AuthenticationFailed,但返回表中的所有条目返回 200 OK
- python - 我无法使用 pyaudio 。我无法用这个库录制声音
- android - 我需要为响应 URL 和请求 URL 创建一个单独的网页以与 iPay88 集成吗?