我有一个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);
}
答案 0 :(得分:2)
我会尝试
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
中的值更改为“ Complete”,它将保持完整状态(请注意,如果两行中都有不同的数据,可能会扭曲数据)。clearContent()
范围内的内容,以避免除去工作表中的所有内容,而仅除去其特定部分。在这里,我重建了它以保留标题参考