google-apps-script - 如何根据条件正确更新单元格?
问题描述
我在尝试使我的脚本正常工作时遇到了麻烦,我想知道是否有人可以帮助我解决这个问题。
我正在使用 Google 表格中的一个简单脚本,如果两行的 A、B、C、E 和 F 列相同,它将覆盖一行中的 D 列单元格。示例表的屏幕截图可以在这里看到。第 2 行是根据原始预留创建的,其中 AF 列由外部程序填充,G 和 H 列稍后由 Appsheet 填充。如果预订状态发生变化,外部程序将创建一个新行,其中包含更新的预订状态列 AF。我的想法是有一个脚本,如果它在数据中发现另一行具有相同的司机姓名、汽车、事件、日期和持续时间,它将替换原始预订 D 列中的一个单元格。
我试图将我的脚本基于重复删除脚本,但作为输出,它会删除“更新”行而不替换原始的 D 单元格。任何帮助将不胜感激!
//overwrite old rows with updated rows
function update() {
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
var newData = new Array();
for(i in data){
var row = data[i];
var update = false;
for(j in newData){
if(row.slice(0,2).join() == newData[j].slice(0,2).join() && row.slice(4,5).join() == newData[j].slice(4,5).join() && row.slice(3).join() !== newData[j].slice(3).join() ){
update = true;
}
}
if(!update){
newData.push(row);
}
}
// Clear the existing info and update with newData.
sheet.clearContents();
sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}
解决方案
假如说:
- 您想比较不同行中的 A、B、C、E、F 列。
- 如果所有这些值都匹配,而 D 中的值不匹配,则您希望将 D 列的值从索引较高的行复制到索引较低的行,并删除索引较高的行。
- 您在 E 和 F 列中有日期和时间值。
如果所有这些都是正确的,你可以试试这个:
function update() {
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
var rowsToDelete = []; // Array to store the rows to be deleted (this avoids the deletion of rows messing with the loop indexes)
for (var i = 1; i < data.length; i++) {
var firstRow = data[i];
for (var j = i; j < data.length; j++) {
var secondRow = data[j];
if (i != j && firstRow[0] == secondRow[0] && firstRow[1] == secondRow[1] && firstRow[2] == secondRow[2] && firstRow[4].getTime() == secondRow[4].getTime() && firstRow[5].getTime() == secondRow[5].getTime() && firstRow[3].toLowerCase() != secondRow[3].toLowerCase()) {
sheet.getRange(i + 1, 4).setValue(secondRow[3]); // Copying value D from higher to lower index
rowsToDelete.push(j + 1); // New row to be removed
}
}
}
rowsToDelete.sort(function(a, b){return b - a}); // Sorting the rows to delete from higher to lower (to avoid messing with loop indexes)
for (var r = 0; r < rowsToDelete.length; r++) {
sheet.deleteRow(rowsToDelete[r]); // Deleting rows
}
}
您可以检查内联注释以逐步了解代码在做什么。
请注意,要比较 E 列和 F 列中的值,您应该使用getTime()或valueOf()(否则这些条件将返回false
)。
我希望这有任何帮助。
推荐阅读
- angularjs - 使用 ng-if-start 而不是多个 ng-if 时有什么性能提升?
- python - Numpy索引:二维数组中每一行的第一个(变化的)元素数
- python - 如何加入大量数据框
- sql - 将表中的行转换为星期几
- php - Woocommerce 类别限制
- ms-access - 访问 - 连接两位小数时出现错误 3615
- selenium - 为什么 CrossBrowser 自动脚本在边缘浏览器中引发错误?
- python-3.x - 如何在 python unittest 脚本中抑制 ImportWarning
- dns - 我无法在 godaddy whm 中编辑我的 dns 区域
- symfony - 在php控制器中将类型设置为rest url变量