Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 比较ID列和更新日期(如果更改)_Javascript_Arrays_Datetime_Google Apps Script_Google Sheets - Fatal编程技术网

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
,反之亦然,并相应地调整列位置?尝试过……不起作用……我猜您正在reduce
reduce((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);
}