使用Apps Script导入本地CSV到Google Sheets的跨设备问题排查
解决方案
问题根源
- 权限限制:你使用的简单
onEdit()触发器会以触发用户的权限运行,而目标工作表是仅所有者可编辑的,导致其他用户触发时脚本无权限写入数据,执行记录显示“完成”但实际未生效。 - DOM元素获取错误:原HTML代码中通过
e.file.files[0]获取文件的方式存在兼容性问题,部分浏览器可能无法正确定位到文件输入元素。
修复步骤
1. 替换为可安装触发器
可安装触发器允许以所有者身份运行脚本,直接绕过受保护工作表的权限限制:
- 打开脚本编辑器,点击左侧时钟图标进入触发器页面。
- 点击「添加触发器」,配置如下:
- 选择函数:
importCSV - 部署类型:从电子表格
- 事件类型:编辑时
- 运行权限:以你(账号A,所有者)的身份运行
- 选择函数:
- 保存并完成授权流程。
2. 修改HTML文件(importCSV.html)
修正文件获取逻辑,添加错误回调:
<form> <input type="file" name="file" onchange="importCSV(this)" accept=".csv,text/csv"> <div id="progress">Waiting</div> </form> <script> function importCSV(input) { const div = document.getElementById("progress"); div.innerHTML = "Uploading..."; const file = input.files[0]; if (!file) return; const f = new FileReader(); f.onload = d => google.script.run .withSuccessHandler(_ => { div.innerHTML = "Done"; setTimeout(google.script.host.close, 1000); }) .withFailureHandler(err => { div.innerHTML = `Error: ${err.message}`; }) .importCSV([[...new Int8Array(d.target.result)], file.type, file.name]); f.readAsArrayBuffer(file); } </script>
3. 修改GAS脚本(importCSV.gs)
添加错误捕获、复选框重置逻辑:
function importCSV(e){ try { const MasterCsvFileSheet = SpreadsheetApp.openById("CsvSpreadsheetID").getSheetByName("ImportHereSheet"); // 处理复选框触发,显示上传对话框并重置复选框 if (!e || (e.range && e.range.getValue())) { SpreadsheetApp.getUi().showModalDialog(HtmlService.createHtmlOutputFromFile("importCSV"), "Choose CSV"); if (e && e.range) e.range.setValue(false); return; } // 解析并写入CSV数据 const csv = Utilities.parseCsv(Utilities.newBlob(...e).getDataAsString()); if (csv.length === 0) throw new Error("CSV文件为空"); MasterCsvFileSheet.getRange(MasterCsvFileSheet.getLastRow() + 1, 1, csv.length, csv[0].length).setValues(csv); // 保留你的其他计算代码 // ... } catch (err) { console.error(err); if (SpreadsheetApp.getUi) SpreadsheetApp.getUi().alert(`操作失败:${err.message}`); } }
验证效果
- 用测试账号在其他电脑上勾选复选框,选择CSV文件上传,此时脚本以所有者权限运行,可正常写入受保护工作表。
- 若出现错误,页面会弹出具体提示,便于排查问题。
内容的提问来源于stack exchange,提问作者akivura
相关产品推荐
相关产品推荐

