如何用AppScript读取非自有.xlsx导入的Google Sheets数据并自动导入
问题分析与解决办法
一、先修正脚本里的明显错误
你的脚本有两个用法错误,直接导致读取失败:
SpreadsheetApp.openByUrl()要传完整表格URL,不是文件ID。想用ID的话,改用SpreadsheetApp.openById('文件ID')。SpreadsheetApp.getActiveSpreadsheet()不用传参数,它是获取当前绑定脚本的表格。要指定目标表格,同样用openById或者openByUrl。
修正后的脚本:
function rePlaceSheet () { // 用ID打开源表格 let source = SpreadsheetApp.openById('14rIrUEOpLNWfQjIW29v1Zc9eDkaomMBx').getSheetByName('sheet1'); // 用ID打开目标表格 let target = SpreadsheetApp.openById('1xjW28VmFypAOjHi_FJ_7MGCigGrIIp-AgTkfuR7m7QQ').getSheetByName('sheet1'); let sRange = source.getDataRange(); let rawData = sRange.getValues(); target.clear({contentsOnly: true}); // 按数据实际行列数写入,避免源和目标行列不匹配报错 target.getRange(1, 1, rawData.length, rawData[0].length).setValues(rawData); }
二、解决权限问题
你不是源表格所有者,且它是xlsx导入Drive后转的Sheets,必须满足这两点:
- 源表格所有者已经给你至少查看权限,要么直接添加你的邮箱为协作者,要么设置成“知道链接的人可查看/编辑”。
- 第一次运行脚本时,弹出的授权窗口里,一定要允许脚本访问这个源表格。如果授权时没看到相关权限选项,让所有者重新分享一次文件。
三、特殊情况处理:源文件还是xlsx格式
如果源文件只是用Sheets打开,但实际还是xlsx格式存储,上面的方法可能失效,试试用Drive API解析:
- 在脚本编辑器里,点击「服务」→ 添加「Drive API」服务。
- 用下面的代码读取并导入:
function importXlsxFromDrive() { const sourceFileId = '14rIrUEOpLNWfQjIW29v1Zc9eDkaomMBx'; const targetSheet = SpreadsheetApp.openById('1xjW28VmFypAOjHi_FJ_7MGCigGrIIp-AgTkfuR7m7QQ').getSheetByName('sheet1'); // 获取xlsx文件二进制内容 const file = DriveApp.getFileById(sourceFileId); const blob = file.getBlob(); // 创建临时表格解析xlsx const tempSpreadsheet = SpreadsheetApp.create('TempXlsxImport'); const tempSheet = tempSpreadsheet.getSheetByName('Sheet1'); // 导入xlsx内容到临时表格(适合纯文本格式的xlsx) tempSheet.getRange('A1').setValues(Utilities.parseCsv(blob.getDataAsString())); // 把临时表格的数据写入目标表格 const data = tempSheet.getDataRange().getValues(); targetSheet.clear({contentsOnly: true}); targetSheet.getRange(1, 1, data.length, data[0].length).setValues(data); // 删除临时表格 DriveApp.getFileById(tempSpreadsheet.getId()).setTrashed(true); }
要是xlsx有复杂格式(合并单元格、公式等),建议先把源文件转成正式的Google Sheets:右键Drive里的xlsx文件→打开方式→Google Sheets,然后保存为Sheets格式,再用第一种脚本读取。
内容的提问来源于stack exchange,提问作者Vinicius Oliveira
相关产品推荐
相关产品推荐

