Google Apps Script跨工作簿复制指定工作表值的技术求助
修复跨文件夹Google Sheets同名工作表值复制的脚本问题
原脚本存在的问题
- 语法错误:
copyAndPasteSheetWithNewName函数末尾多了一个冗余的},导致脚本无法正常解析 - 未定义变量:代码中
spreadsheet.getActiveRange()的spreadsheet未声明,属于无效引用 - 无异常处理:未判断目标工作簿中是否存在指定名称的工作表,遇到无对应表的文件会直接报错
- 使用弃用API:
Browser.inputBox已被Google标记为弃用,存在兼容性风险 - 目标范围逻辑模糊:直接复制到当前活动单元格范围,若范围大小与源表不匹配,会导致数据异常
修正后的脚本
function onOpen() { SpreadsheetApp.getUi() .createMenu('Copy and Paste') .addItem('复制同名工作表值', 'copyAndPasteSheetValues') .addToUi(); } function copyAndPasteSheetValues() { // 使用官方推荐的UI弹窗获取工作表名称 const ui = SpreadsheetApp.getUi(); const response = ui.prompt('输入要复制的工作表名称:', ui.ButtonSet.OK_CANCEL); if (response.getSelectedButton() !== ui.Button.OK) return; const sheetName = response.getResponseText().trim(); if (!sheetName) { ui.alert('请输入有效的工作表名称'); return; } // 获取当前文件所在的文件夹 const activeFile = SpreadsheetApp.getActiveSpreadsheet(); const folder = DriveApp.getFileById(activeFile.getId()).getParents().next(); const files = folder.getFilesByType(MimeType.GOOGLE_SHEETS); // 获取接收数据的目标工作表(当前活动工作表) const targetSheet = activeFile.getActiveSheet(); let targetRow = 1; // 从A1开始粘贴,后续表的数据追加到下方 while (files.hasNext()) { const file = files.next(); // 跳过当前活动文件,避免重复复制 if (file.getId() === activeFile.getId()) continue; try { const workbook = SpreadsheetApp.open(file); const sourceSheet = workbook.getSheetByName(sheetName); if (!sourceSheet) { console.log(`文件 ${file.getName()} 中未找到名为 ${sheetName} 的工作表`); continue; } // 获取源表有数据的实际范围(避免复制空行空列) const sourceRange = sourceSheet.getDataRange(); const values = sourceRange.getValues(); // 粘贴到目标表的对应位置 const targetRange = targetSheet.getRange(targetRow, 1, values.length, values[0].length); targetRange.setValues(values); // 更新下一次粘贴的起始行 targetRow += values.length; } catch (e) { console.log(`处理文件 ${file.getName()} 时出错: ${e.message}`); ui.alert(`处理文件 ${file.getName()} 时出错: ${e.message}`); } } ui.alert('所有符合条件的数据已复制完成'); }
脚本说明
- 打开目标接收数据的Google Sheet,刷新页面后会出现「Copy and Paste」菜单栏
- 选择「复制同名工作表值」,输入要复制的工作表名称
- 脚本会遍历同一文件夹下所有Google Sheets工作簿,跳过当前文件,将找到的同名工作表数据以值的形式追加到当前活动工作表中
- 加入了异常处理,遇到错误会弹窗提示并记录日志
内容的提问来源于stack exchange,提问作者Jezzer
相关产品推荐
相关产品推荐

