Javascript 如何基于ID更新另一张图纸上的行,而不使用空白单元格覆盖?

Javascript 如何基于ID更新另一张图纸上的行,而不使用空白单元格覆盖?,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我正试图使用Google Apps脚本,根据每个页面第4列中的匹配ID,将行从一个页面复制到另一个页面,但我似乎找不到如何将其粘贴到匹配行中,并在不使用空白单元格覆盖现有数据的情况下执行此操作 在Google Sheets中,Sheet1包含由ID定义的新数据行。Sheet2应收集每一行,如果Sheet1上的新行ID与Sheet2上的现有行匹配,则使用新数据更新行。一天结束时,Sheet1被清除,剩下的是Sheet2中每个ID项目的最新信息。有时,Sheet1上的行没有完全填写,在这种情况下,只

我正试图使用Google Apps脚本,根据每个页面第4列中的匹配ID,将行从一个页面复制到另一个页面,但我似乎找不到如何将其粘贴到匹配行中,并在不使用空白单元格覆盖现有数据的情况下执行此操作

在Google Sheets中,Sheet1包含由ID定义的新数据行。Sheet2应收集每一行,如果Sheet1上的新行ID与Sheet2上的现有行匹配,则使用新数据更新行。一天结束时,Sheet1被清除,剩下的是Sheet2中每个ID项目的最新信息。有时,Sheet1上的行没有完全填写,在这种情况下,只有包含数据的单元格(来自Sheet1)应该在Sheet2上被覆盖

新的ID将被附加,但我已经或多或少地解决了如何做,这不是问题的一部分:)

函数myFunction(){
//正确电子表格的路径
var ss=SpreadsheetApp.getActive();
var sheet1=ss.getSheetByName(“sheet1”);
var sheet2=ss.getSheetByName(“sheet2”);
var sheet3=ss.getSheetByName(“sheet3”);//临时,我正在研究如何将其复制到Sheet2的右侧行
//获取范围的大小
var header=1;//头信息的行数(要跳过)
var range1=sheet1.getDataRange();
var data1=range1.getValues();
var range2=sheet2.getDataRange();
var data2=data2=range2.getValues();
Logger.log('data1='+data1);
var resultArray=[];
对于(var n=标题;n
我已经设法拼凑出找到匹配ID的代码,并将整行发送到Sheet3(现在,在研究如何将其发送到Sheet2的正确行之前)。但这会用空白单元格(如果有)覆盖任何现有数据,我似乎无法使{contentsOnly:true}工作(这是正确的方法吗?)

我做这件事才一个星期,很努力,但超出了我的能力范围。任何帮助,即使只是指向正确的学习方向,都将不胜感激。在过去的48小时里,我一直在stackoverflow上生活,试图找到类似的东西,但我什么也找不到(也许我甚至没有找到正确的东西!)。非常谦卑。

试试这个:

function myFunction() {
  var ss = SpreadsheetApp.getActive();
  var sheet1 = ss.getSheetByName("Sheet1");
  var sheet2 = ss.getSheetByName("Sheet2");
  var sheet3 = ss.getSheetByName("Sheet3");
  var header = 1;  // Number of rows of header info (to skip)
  var range1 = sheet1.getDataRange();
  var data1 = range1.getValues();
  var range2 = sheet2.getDataRange();
  var data2 = data2 = range2.getValues();
  var resultArray = [];
  for(var n=header; n < data1.length ; n++){
    var keep = false;
    for(var p=header; p < data2.length ; p++){
      if( data1[n][3] == data2[p][3]){
        var tA=[];
        var rg=sheet2.getRange(p+1,1,1,sheet2.getLastColumn());
        for(var i=0;i<data1[0].length;i++) {
          tA.push((data1[n][i])?data1[n][i]:data2[p][i]);
        }
        rg.setValues([tA]);
        break ;
      }
    }
  }  
}
函数myFunction(){
var ss=SpreadsheetApp.getActive();
var sheet1=ss.getSheetByName(“sheet1”);
var sheet2=ss.getSheetByName(“sheet2”);
var sheet3=ss.getSheetByName(“sheet3”);
var header=1;//头信息的行数(要跳过)
var range1=sheet1.getDataRange();
var data1=range1.getValues();
var range2=sheet2.getDataRange();
var data2=data2=range2.getValues();
var resultArray=[];
对于(var n=标题;n对于(var i=0;如果(data1[n][3]==data2[p][3]),则比较的是第4列而不是第3列
数组从零开始索引,电子表格中的列从一开始。为什么要使用sheet3?难道你不希望Sheet2中的所有内容吗?是的,你是对的。这是google工作表中的第4列。正如我所提到的,我使用sheet3,因为这是我至少让函数将所选行复制到某处的方式,但理想情况下它会找到ma在Sheet2中输入tch并将其复制到相关行。这是我的结束游戏,尽管我还没有到达。感谢您的尝试。现在尝试破译它。但是它似乎不起作用,给我
无法将数组转换为对象[][]。
对于此行
rg.setValues(tA);
(根据您之前的评论,我将2s改为3s,以符合它位于第四列的事实。)共享一些数据以便我调试它。这是我运行此功能的测试表。非常稀疏,但目的是将其用作个人任务管理器的一部分。Sheet2将收集所有任务,Sheet1是新任务的一天表。这是整个任务的一小部分(日历、任务、表单已经开始工作;还有一些细节需要改进)。我刚刚更改了代码。再次复制。它现在开始工作。一些拼写错误和一个命令出现在错误的位置。您还必须确保Sheet1和Sheet2都有六个标题。我使用它们获得了正确的列数
function myFunction() {
  var ss = SpreadsheetApp.getActive();
  var sheet1 = ss.getSheetByName("Sheet1");
  var sheet2 = ss.getSheetByName("Sheet2");
  var sheet3 = ss.getSheetByName("Sheet3");
  var header = 1;  // Number of rows of header info (to skip)
  var range1 = sheet1.getDataRange();
  var data1 = range1.getValues();
  var range2 = sheet2.getDataRange();
  var data2 = data2 = range2.getValues();
  var resultArray = [];
  for(var n=header; n < data1.length ; n++){
    var keep = false;
    for(var p=header; p < data2.length ; p++){
      if( data1[n][3] == data2[p][3]){
        var tA=[];
        var rg=sheet2.getRange(p+1,1,1,sheet2.getLastColumn());
        for(var i=0;i<data1[0].length;i++) {
          tA.push((data1[n][i])?data1[n][i]:data2[p][i]);
        }
        rg.setValues([tA]);
        break ;
      }
    }
  }  
}