多工作表共用变量,仅触发按钮所在表导出的问题排查
问题修复方案
一、解决"TypeError: Cannot read property 'copyTo' of null"错误
该错误由3处代码问题导致,逐一修复即可:
- 数组索引越界
原循环从k=1开始到sheetListArray.length,但数组索引从0起始,当k=sheetListArray.length时,sheetListArray[k]为undefined,传入getSheetByName后返回null。
修复:调整循环逻辑:
for(var k = 0; k < sheetListArray.length; k++){ ExportData1g(sheetListArray[k]); }
- PB1g函数调用未传参
在ExportData1g中调用PB1g()时未传入sheetname参数,导致PB1g里ss.getSheetByName(sheetname)返回null。
修复:调用时传入参数:
if (cell === "1" || cell === "0") { PB1g(sheetname); }
- 条件判断逻辑错误
原代码if (cell == "1" || "0")中,"0"属于布尔真值,条件永远成立,会触发不符合预期的逻辑执行。
修复:修正判断逻辑:
if (cell === "1" || cell === "0") {
二、确保仅导出触发按钮所在工作表的数据
无需遍历工作表数组,直接获取当前激活的工作表(即按钮所在工作表)即可:
- 删除原有数组遍历循环,替换为获取当前工作表的逻辑:
var ss = SpreadsheetApp.getActiveSpreadsheet(); var activeSheet = ss.getActiveSheet(); ExportData1g(activeSheet.getName());
- 此修改后,点击按钮时只会处理当前按钮所在的工作表,无需手动维护工作表数组,适配性更强。
完整修复后的代码
var ss = SpreadsheetApp.getActiveSpreadsheet(); // 获取当前按钮所在的工作表 var activeSheet = ss.getActiveSheet(); ExportData1g(activeSheet.getName()); function ExportData1g(sheetname) { var result = SpreadsheetApp.getUi().alert("Fertig-Hacken gesetzt?", SpreadsheetApp.getUi().ButtonSet.OK_CANCEL); if (result === SpreadsheetApp.getUi().Button.OK) { const ssh = ss.getSheetByName(sheetname); const cell = ssh.getRange("CheckButton1").getValue(); // 修正条件判断逻辑 if (cell === "1" || cell === "0") { // 传入sheetname参数 PB1g(sheetname); } else { return; } } else { return; } const ssh = ss.getSheetByName(sheetname); var dataRange = ssh.getRange('CheckBox1'); var values = dataRange.getValues(); for (var i = 0; i < values.length; i++) { for (var j = 0; j < values[i].length; j++) { if (values[i][j] == true) { values[i][j] = false; } } } dataRange.setValues(values); var commentRange = ssh.getRange('ResetComment1'); var dataRange = ssh.getRange('EmptyBoxes1'); var values = dataRange.getValues(); for (var i = 0; i < values.length; i++) { for (var j = 0; j < values[i].length; j++) { if (values[i][j] == 1) { values[i][j] = 0; } } } commentRange.clearContent(); dataRange.setValues(values); } function PB1g(sheetname) { const ssh = ss.getSheetByName(sheetname); const tss = SpreadsheetApp.openById("1wMw5H48Fmc1R8WGy34d80x9-W996c9GNVuAD3-mFtVQ"); const tsh = tss.getSheetByName("PB"); const nsh = ssh.copyTo(tss); var firstEmptyRow = tsh.getLastRow() + 1; var timestamp = new Date(); tsh.appendRow([timestamp]); nsh.getRange("CopytoMasterdata1").copyTo(tsh.getRange("B" + firstEmptyRow), {contentsOnly:true}); tss.deleteSheet(nsh); }
内容的提问来源于stack exchange,提问作者Fiorina193
相关产品推荐
相关产品推荐

