开发者问题收集

如果条件满足,Google Apps 脚本复制范围

2020-09-28
1683

我有两个电子表格,源和目标。在源中我有数据表,在目标中我有存档表。在数据表中,J 列包含百分比。我正在尝试编写一个脚本,该脚本会自动复制 J 单元格中大于 10% 的行的范围 (A:I) 以附加到存档表中。

我卡在了这一点上:

function CopyRange() {
  var sourcespread = SpreadsheetApp.openById('aaa'); //replace with source ID
  var sourcesheet = sourcespread.getSheetByName('bbb'); //replace with source Sheet tab name
  var destspread = SpreadsheetApp.openById('ccc'); //replace with destination ID
  var destsheet = destspread.getSheetByName('ddd'); //replace with destination Sheet tab name
  var testrange = sourcesheet.getRange('J:J');
  var testvalue = (testrange.setNumberFormat("0.00").getValues());
  var data = [];
  var j =[];
  //Condition to check in J:J, if true, copy the same row to data array 
  for (i=0;i<testvalue.length;i++) {
    if (testvalue[i] >= 10) {
    data.push.apply(data,sourcesheet.getRange(i+1,1,1,3).getValues());
  //Copy matched ROW numbers to j
    j.push(i);
}  
}
  //Copy data array to destination sheet
  destsheet.getRange(destsheet.getLastRow()+1,1,data.length,data[0].length).setValues(data);
}

我收到错误:

TypeError: Cannot read property 'length' of undefined (line 19, file "cp3")

screenshot

2个回答

问题:

if (testvalue[i] >= 10)
  • 此条件永远不会满足,因此 data 是一维数组 (= [] ),而不是二维数组。因此,

    • data =[]
    • data[0] = undefined (在索引 0 中没有值)
    • data[0].length =>抛出:

TypeError: Cannot read property 'length' of undefined (line 19, file "cp3")

条件永远不满足的原因是

In data sheet J column contains percentages

10% 的值为 0.1 (10/100) 而不是 10

解决方案:

  • 使用 0.1 代替 10

  • 此外,正如 上一个答案 所述, testValue 是一个二维数组。尽管会隐式转换为 number ,但最好使用适当的索引:

    if (testvalue[i][0] >= 0.1)
    

阅读:

TheMaster
2020-09-28

问题:

  • testvalue 是一个 2D 值数组,因此在 if 条件中,您将 进行比较,而不是 。因此,您应该 flat 数组: var testvalue = testrange.setNumberFormat("0.00").getValues().flat();

解决方案:

function CopyRange() {
  var sourcespread = SpreadsheetApp.openById('aaa'); //replace with source ID
  var sourcesheet = sourcespread.getSheetByName('bbb'); //replace with source Sheet tab name
  var destspread = SpreadsheetApp.openById('ccc'); //replace with destination ID
  var destsheet = destspread.getSheetByName('ddd'); //replace with destination Sheet tab name
  var testrange = sourcesheet.getRange('J:J');
  var testvalue = testrange.getValues().flat();
  var data = [];
  var j =[];
  //Condition to check in J:J, if true, copy the same row to data array 
  for (i=0;i<testvalue.length;i++) {
    if (testvalue[i] >= 10) { 
    data.push.apply(data,sh.getRange(i+1,1,1,3).getValues());  
  //Copy matched ROW numbers to j
    j.push(i);
}  
}
  //Copy data array to destination sheet
if(data.length!=0){destsheet.getRange(destsheet.getLastRow()+1,1,data.length,data[0].length).setValues(data);}
}
Marios
2020-09-28