Google script:如何复制符合条件的最后一行



我是新的脚本,我试图为个人使用根据主表自动复制数据,我被困在一个技巧。

我刚刚调整了这个脚本,将数据从一个表复制到另一个表,但是当它运行时,除了新数据外,还会在循环中复制相同的数据。当我运行脚本时,我只是尝试只复制新行。

谢谢你的帮助

function CopyDataGames() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet1 = ss.getSheetByName("Source");
var topsheet = ss.getSheetByName("Copie");
var topsheetLastRow = topsheet.getLastRow();
let lastRow = sheet1.getLastRow();

let sortRange = sheet1.getSheetValues(2,2,lastRow,44);
Logger.log(lastRow)
Logger.log(typeof(sortRange))
Logger.log(sortRange.length);

let topCounter = 1;
for (var i = 1; i <= sortRange.length; i++){
let name = sheet1.getRange(i,2).getValue();
console.log(i + " - " + name);
// find the name
if (name =="PoinPOin"){
let rowValues = sheet1.getRange(i,1,1,44).getValues();
topsheet.getRange(topsheetLastRow+topCounter,1,1,44).setValues(rowValues);
topCounter++; }
}
}

修改点:

  • 关于however when it runs the same data is copied in a loop in addition to the new ones.,我认为这个问题的原因是由于你的脚本没有确认" copy "的现有值。床单为了达到您的目的,我认为需要确认" copy "的值表。
  • 在您的脚本中,getValuessetValues在循环中使用。在这种情况下,过程成本将变得很高。Ref

当这些要点反映在您的脚本中时,如何进行以下修改?

修改脚本:

function CopyDataGames() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet1 = ss.getSheetByName("Source");
var topsheet = ss.getSheetByName("Copie");
// I modified below script.
var srcValues = sheet1.getDataRange().getValues();
var dstObj = topsheet.getDataRange().getValues().reduce((o, r) => (o[r.join()] = r, o), {});
var res = srcValues.filter(r => r[1] == "PoinPOin" && !dstObj[r.join()]);
if (res.length == 0) return;
topsheet.getRange(topsheet.getLastRow() + 1, 1, res.length, res[0].length).setValues(res);
}
  • 当这个脚本运行时,"Source"one_answers";Copie"检索表。然后,检查重复的值。然后,新值被放入" copy "表。

注意:

  • 如果您只想检查"源"Sheet,下面修改的脚本怎么样?

    function CopyDataGames() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet1 = ss.getSheetByName("Source");
    var topsheet = ss.getSheetByName("Copie");
    // I modified below script.
    var lastRowValue = sheet1.getRange(sheet1.getLastRow(), 1, 1, sheet1.getLastColumn()).getValues()[0];
    var dstObj = topsheet.getDataRange().getValues().reduce((o, r) => (o[r.join()] = r, o), {});
    if (lastRowValue[1] != "PoinPOin" || dstObj[lastRowValue.join()]) return;
    topsheet.appendRow(lastRowValue);
    }
    

引用:

  • reduce ()
  • 过滤器()

最新更新