【发布时间】:2022-01-15 12:55:45
【问题描述】:
目标
防止脚本将导致错误的空白(空)行从源复制到目标。
错误详情:
Google App 脚本:TypeError:无法读取未定义的属性“长度”(行 *,文件“代码”)
此错误,指的是以下行:
dstSheet.getRange(dstLastRow + 1, 1, values.length, values[0].length).setValues(values);
完整代码
我正在使用HERE 中的以下代码,该代码已稍作修改。无论有没有修改,都会发生错误。代码的逻辑是:如果destination sheet不包含ID,import ID,以及从source到destination的具体列。
function importNewEmployeeIds() {
const srcSheetName = 'Source';
const dstSheetName = 'Destination';
const srcSheet = SpreadsheetApp.openById("SpreadsheetID1").getSheetByName(srcSheetName);
const dstSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(dstSheetName);
// Retrieve values from source sheet.
var headerRowNumber = 1;
const srcValues = srcSheet.getDataRange().offset(headerRowNumber, 0, srcSheet.getLastRow() - headerRowNumber).getValues();
// Retrieve values from destination sheet and create an object for searching the ID.
const dstLastRow = dstSheet.getLastRow();
const dstObj = dstLastRow == 0 ? {} : dstSheet.getRange("A1:A" + dstLastRow).getValues().reduce((o, [a]) => (o[a] = true, o), {});
// Create an array for putting to the destination sheet.
const values = srcValues.filter(r => !dstObj[r[1]]).map(r => [r[1], r[19], "", r[18]]);
// Put the values to the destination sheet.
dstSheet.getRange(dstLastRow + 1, 1, values.length, values[0].length).setValues(values);
}
疑难解答
[来源] 之前脚本运行。
| A |B| C | D |
|200001| |Email2|Email1|
|200001| |Email2|Email1|
|200006| |Email4|Email3|
|200007| |Email6|Email5|
| | | | |
[Destination] 之前脚本运行。
| A |B| C | D |
|200001| |Email2|Email1|
[Destination] 之后脚本运行。
| A |B| C | D |
|200001| |Email2|Email1|
|200006| |Email4|Email3|
|200007| |Email6|Email5|
| | | | | <-- Notice the blank row. I don't want the blank row.
脚本运行后,会将行数据从源复制到目标。问题是,脚本还会将空白(空)行复制到源工作表中。
[目的地] 预期结果 - 没有空白行
| A |B| C | D |
|200001| |Email2|Email1|
|200006| |Email4|Email3|
|200007| |Email6|Email5|
我能想到的菜鸟解决方案:
选项 A) 在脚本的开头,我可以首先从目标中删除所有空行。这效率较低,并不能解决问题的根源,但至少它解决了我的问题。
function removeEmptyRows(){
var sh = SpreadsheetApp.getActiveSheet();
var maxRows = sh.getMaxRows();
var lastRow = sh.getLastRow();
if (maxRows-lastRow != 0){
sh.deleteRows(lastRow+1, maxRows-lastRow);
}
}
找到代码:HERE
选项 B) 更新原始代码,使其不会复制空白行。
[之前]
const srcValues = srcSheet.getDataRange().offset(headerRowNumber, 0, srcSheet.getLastRow() - headerRowNumber).getValues();
[之后]
const srcValuesAndBlankRows = srcSheet.getDataRange().offset(headerRowNumber, 0, srcSheet.getLastRow() - headerRowNumber).getValues();
const srcValues = srcValuesAndBlankRows.filter(String); //Removes Blank Rows
找到代码:HERE
【问题讨论】:
-
虽然我不确定我是否能正确理解你的问题,但我提出了一个修改后的脚本作为答案。你能确认一下吗?如果我误解了你的问题,我很抱歉。如果我提出的脚本没有用,您能否提供您期望的示例输入和输出情况作为图像?通过这个,我想修改脚本。
-
@Tanaike 我已经修改了我的问题,使其更短,更容易理解。我添加了表格来展示脚本运行前、脚本运行后以及脚本运行后的预期结果。我希望这更容易理解:)
标签: javascript google-apps-script google-sheets