我是新的脚本,我试图为个人使用根据主表自动复制数据,我被困在一个技巧。
我刚刚调整了这个脚本,将数据从一个表复制到另一个表,但是当它运行时,除了新数据外,还会在循环中复制相同的数据。当我运行脚本时,我只是尝试只复制新行。
谢谢你的帮助
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 "的值表。 - 在您的脚本中,
getValues
和setValues
在循环中使用。在这种情况下,过程成本将变得很高。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 ()
- 过滤器()