无法使用当前代码填充数组

时间:2018-01-11 22:49:12

标签: google-apps-script google-sheets

如果缺少主工作表中的新数据,我试图检查目标工作表。如果是这样,它将新数据从主表中的3列复制到目标表。我最后收到错误,因为我的数组未定义,我不确定如何解决问题。错误是TypeError:无法读取属性" length"来自undefined。 (第27行,文件"代码")

第27行是第二行到最后一行(.setValues(arr);)

function Copy() {
    var sourceSheet = SpreadsheetApp.openById('1iyxDeeKoPdVwl15bXTOeorbHylw_i39BsM4NQnxDeiY')
        .getSheetByName('Jobs Log');
var lastRow = sourceSheet.getLastRow();
if (prevLastRow == undefined) {
        prevLastRow = (sourceSheet.getLastRow() -1);
        }
else {
var prevLastRow = PropertiesService.getScriptProperties.getProperty('lastRow');
}
if (lastRow <= prevLastRow) {
  return;
}
var range = sourceSheet.getRange(prevLastRow,
                                 1,
                                 lastRow - prevLastRow,
                                 sourceSheet.getLastColumn()
                                ); 
    var arr = [];
    var rangeval = range.getValues()
        .forEach(function (r, i, v) {
            if (r[i][1] == 'Amber') arr.push([v[i][0], v[i][3], v[i][2]]);
        });
    var destinationSheet = SpreadsheetApp.openById('1UXPyPmOcsLzyBXAzKax8oVVvUSRC8bfgLP2S7j2F9Yw')
        .getSheetByName('Sheet1');
    destinationSheet.getRange(destinationSheet.getLastRow() +1, 1, arr.length, arr[0].length)
        .setValues(arr);
PropertiesService.getScriptProperties.setProperty('lastRow', lastRow)
}

Master Sheet image

Target sheet image

编辑: 我已将第一个If语句更改为以下内容:

if (prevLastRow == undefined) {
        prevLastRow = 1;
        }
else {
var prevLastRow = PropertiesService.getScriptProperties.getProperty('lastRow');
}

这将返回另一个电子表格中的值,但它不会保存最后一行,因为我试图在主代码的最后一行中进行操作。

第二次编辑:此代码有效,但不会复制最后一行:

function Copy() {
    var sourceSheet = SpreadsheetApp.openById('1iyxDeeKoPdVwl15bXTOeorbHylw_i39BsM4NQnxDeiY')
        .getSheetByName('Jobs Log');
var lastRow = sourceSheet.getLastRow();
if (PropertiesService.getScriptProperties().getProperty('lastRow') == undefined) {
        prevLastRow = 1;
        }
else {
var prevLastRow = PropertiesService.getScriptProperties().getProperty('lastRow');
}
if (lastRow <= prevLastRow) {
  return;
}
var range = sourceSheet.getRange(prevLastRow,
                                 1,
                                 lastRow - prevLastRow,
                                 sourceSheet.getLastColumn()
                                ); 
    var arr = [];
    var rangeval = range.getValues()
        .forEach(function (r, i, v) {
            if (r[1] == 'Amber') arr.push([v[i][0], v[i][3], v[i][2]]);
        });
    var destinationSheet = SpreadsheetApp.openById('1UXPyPmOcsLzyBXAzKax8oVVvUSRC8bfgLP2S7j2F9Yw')
        .getSheetByName('Sheet1');
    destinationSheet.getRange(destinationSheet.getLastRow() +1, 1, arr.length, arr[0].length)
        .setValues(arr);
PropertiesService.getScriptProperties().setProperty('lastRow', lastRow)
}

1 个答案:

答案 0 :(得分:0)

这是一个适用于寻找类似内容的人的工作版本。 :)

我上次编辑的解决方案是改变开始的行&#34; var range = ...&#34;将lastRow - prevLastRow更改为(lastRow - prevLastRow)+1并记录最后一行。

function Copy() {
    var sourceSheet = SpreadsheetApp.openById('1iyxDeeKoPdVwl15bXTOeorbHylw_i39BsM4NQnxDeiY')
        .getSheetByName('Jobs Log');
var lastRow = sourceSheet.getLastRow();
if (PropertiesService.getScriptProperties().getProperty('lastRow') == undefined) {
        prevLastRow = 1;
        }
else {
var prevLastRow = PropertiesService.getScriptProperties().getProperty('lastRow');
}
if (lastRow <= prevLastRow) {
  return;
}
var range = sourceSheet.getRange(prevLastRow,
                                 1,
                                 (lastRow - prevLastRow)+1 ,
                                 sourceSheet.getLastColumn()
                                ); 
    var arr = [];
    var rangeval = range.getValues()
        .forEach(function (r, i, v) {
            if (r[1] == 'Amber') arr.push([v[i][0], v[i][3], v[i][2]]);
        });
    var destinationSheet = SpreadsheetApp.openById('1UXPyPmOcsLzyBXAzKax8oVVvUSRC8bfgLP2S7j2F9Yw')
        .getSheetByName('Sheet1');
    destinationSheet.getRange(destinationSheet.getLastRow(), 1, arr.length, arr[0].length)
        .setValues(arr);
PropertiesService.getScriptProperties().setProperty('lastRow', lastRow)
}