Javascript 比较ID列和更新日期(如果更改)
我有两张纸,即,Javascript 比较ID列和更新日期(如果更改),javascript,arrays,datetime,google-apps-script,google-sheets,Javascript,Arrays,Datetime,Google Apps Script,Google Sheets,我有两张纸,即,Sht1和Sht2。我正在遍历Sht1中的ID列,并尝试将其与Sht2中的ID列匹配如果存在匹配项,则检查Sht2中的日期是否与Sht1中的日期不同。如果是,则用新日期更新Sht1中的日期 Sht1: Sht2: 例如: 从以上屏幕截图中可以看出,Sht2中匹配ID的Sht1是100011000310006101010011 其中,只有100011000610011有新日期。因此,仅针对这些ID,这些新日期应复制到Sht1 由于数据很大,在ID列中循环,匹配它们,然后检查日期
Sht1
和Sht2
。我正在遍历Sht1中的ID列
,并尝试将其与Sht2中的ID列匹配<代码>如果存在匹配项
,则检查Sht2中的日期是否与Sht1中的日期不同。如果是,则用新日期更新Sht1中的日期
Sht1:
Sht2:
例如:从以上屏幕截图中可以看出,
Sht2
中匹配ID的Sht1
是100011000310006101010011
其中,只有
100011000610011
有新日期。因此,仅针对这些ID,这些新日期应复制到Sht1
由于数据很大,在ID列中循环,匹配它们,然后检查日期是否不同,最后将新日期更新回Sht1,这需要花费大量时间。有没有一种雄辩的方法可以做到这一点,而不必像在两张表中拾取JSON对象那样循环和读/写,即,ObjSht1&ObjSht2
,更新ObjSht1
中匹配ID的日期,然后一次性将这个JSON对象ObjSht1
传输到Sht1
编辑:
@修改后的脚本的主脚本是:
function myFunction() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sht1 = ss.getSheetByName("Sht1");
const sht2 = ss.getSheetByName("Sht2");
const idMap = sht2.getDataRange().getValues().reduce( (mp,[,id,,date]) => mp.set(id, date), new Map );
console.log(idMap);
const rg1 = sht1.getDataRange();
const values1 = rg1.getValues();
values1.forEach(row => row[2] = idMap.get(row[0]));
rg1.setValues(values1);
}
@这一次,它将Sht1中的日期替换为ID匹配的Sht2中的日期。但它也抹去了Sht1中ID不匹配的其他日期。
另外,我认为代码并不是在比较日期是否更改,而是将日期从Sht2转储到Sht1
请参见更新的屏幕截图:
- 使用创建第二张工作表的{id=>date}的
- 使用修改第一张图纸的值
对于初学者,可以使用indexOf将特定值与列表匹配。我还将使用for循环,因为我不确定是否有更快的方法,因为匹配不会是连续的,因此您不能一次更新一系列单元格。显示您尝试执行以下操作:将2个工作表中的数据提取为JSON对象,即ObjSht1和ObjSht2,更新ObjSht1中匹配ID的日期,然后将这个JSON对象ObjSht1一次性传输到Sht1go@TheMaster这只是最近一篇文章中的一个想法。我不知道怎么做,试着表现出来。你还打算什么时候试一试?就像我说的,我不知道怎么做。这只是一个想法。有更好的方法吗?事实上,它做的是相反的,即更新Sht2而不是Sht1中的日期。如何交换工作表?@sifar将所有
sht2
更改为sht1
,反之亦然,并相应地调整列位置?尝试过……不起作用……我猜您正在reducereduce((mp,[id,,date])
values2.forEach(row=>row[3]=idMap.get(row[1])中设置位置;这些行上的错误…@sifar,正确设置位置。如果您在合理的努力之后仍然无法计算出错误,请显示修改后的脚本并引用错误。工作!出色且非常周到的代码。谢谢!
function datesFromSht2ToSht1() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sht1 = ss.getSheetByName("Sht1");
const sht2 = ss.getSheetByName("Sht2");
const idMap = sht2.getDataRange().getValues().reduce( (mp,[,id,,date]) => mp.set(id, date), new Map );
const rg1 = sht1.getDataRange();
const values1 = rg1.getValues();
values1.forEach(row => row[2] = idMap.get(row[0]) || row[2]);
rg1.setValues(values1);
}