要从一个工作表复制到另一个工作表的脚本需要编辑

时间:2018-01-09 23:30:30

标签: google-apps-script google-sheets

我有这个脚本运行良好,但我需要编辑它 a)自上次运行以来仅返回新行 b)仅返回某些单元格而不是整行

任何指导都将不胜感激

add_foreign_key "entrees", "snapshots"

}

1 个答案:

答案 0 :(得分:2)

为了仅检查在上次运行时之后添加的新数据,我们必须在属性中存储.getLastRow()值并在每个运行时检索它。我们还必须在一些假设下工作:

  1. 在输入数据中,新值仅附加在底部,而不会插入其他数据
  2. 之间
  3. 数据永远不会从输入表中删除(如果忽略这一点,那么您还必须拥有删除数据后运行的最后一行的更新脚本)
  4. 在添加新数据之后但在运行此脚本之前,不会对工作表进行排序。
  5. 所以你需要的东西是

    var sourceSheet = SpreadsheetApp.openById('1WAtRDYhfVXcBKQoUxfTJORXwAqYvVG2Khl4GuJEYSIs')
        .getSheetByName('Jobs Log');
    var lastRow = sourceSheet.getLastRow();
    
    // note that you need to hav the script property initialized and stored
    // or adjust the if to also check if prevLastRow gets a value
    var prevLastRow = PropertiesService.getScriptProperties().getProperty('lastRow')
    
    if (lastRow <= prevLastRow) {
      return; // we simply stop the execution right here if we don't have more data
    }
    // then we simply start the range from the previous last row
    // and take the amount of rows added afterwards
    var range = sourceSheet.getRange(prevLastRow,
                                     1,
                                     lastRow - prevLastRow,
                                     sourceSheet.getLastColumn()
                                    ); 
    

    关于第二个问题,在forEach内部,您只需将数组推入arr,其中只包含您想要的列。例如,

    if (r[1] == 'Amber') arr.push(v[i]);
    

    变为

    if (r[1] == 'Amber') arr.push([v[i][0], v[i][3], v[i][2]]);
    

    将为每行输出A D C列(按此顺序)。

    最后,在脚本结束之前需要运行的最后一件事是

    PropertiesService.getScriptProperties().setProperty('lastRow', lastRow)
    

    它会让我们知道下次运行脚本时我们停在哪里。同样,请记住,仅当新数据始终位于新行中时,此方法才有效。否则,您需要执行不同的方法并检索2个数据数组。 1表示整个输入表,1表示输出表。然后你必须执行2 if次检查。第一个是查看你的标准是否满足,第二个是看它是否已经存在于输出数据中。