请求修改Google Apps脚本以获取当前表格所在文件夹ID并实现文件上传至该文件夹
请求修改Google Apps脚本以获取当前表格所在文件夹ID并实现文件上传至该文件夹
嘿,我来帮你排查下问题~你遇到的核心问题其实是服务器端代码和客户端代码搞混了,咱们一点点理清楚:
为什么你之前的代码不生效?
你写的SpreadsheetApp.getActiveSpreadsheet()和DriveApp.getFileById()这些API是Google Apps Script的服务器端服务,只能在.gs后缀的脚本文件里运行,不能直接放在HTML页面的JavaScript代码里。你把这段代码直接写在forms.html里的话,客户端浏览器根本识别不了这些API,自然拿不到正确的文件夹ID,上传也就启动不了啦。
正确的解决思路
咱们需要把获取文件夹ID的逻辑放在服务器端,然后通过客户端JS调用服务器端函数拿到ID,再用这个ID去执行上传操作。具体分两步:
1. 在服务器端(.gs文件)写获取文件夹ID的函数
打开你的Google Apps Script编辑器,在.gs文件里添加这个函数:
function getSpreadsheetParentFolderId() { // 获取当前活跃的表格 const activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); // 根据表格ID拿到对应的Drive文件 const spreadsheetFile = DriveApp.getFileById(activeSpreadsheet.getId()); // 获取表格的父文件夹(Drive里文件默认只有一个父文件夹) const parentFolders = spreadsheetFile.getParents(); // 如果有父文件夹,返回它的ID;没有的话返回根文件夹ID if (parentFolders.hasNext()) { return parentFolders.next().getId(); } else { return DriveApp.getRootFolder().getId(); } }
2. 在客户端(forms.html)动态获取文件夹ID并初始化上传
修改你的forms.html里的JavaScript部分,先调用服务器端函数拿到文件夹ID,再启动上传逻辑:
<script> const chunkSize = 5242880; let uploadParentFolderId; // 用来存储动态获取的文件夹ID // 页面加载完成后,先获取文件夹ID window.addEventListener('load', function() { // 调用服务器端函数,成功拿到ID后再初始化上传 google.script.run .withSuccessHandler(function(folderId) { uploadParentFolderId = folderId; // 这里调用你的上传初始化函数,比如绑定上传按钮事件、初始化分块逻辑等 initUploadProcess(); }) .withFailureHandler(function(error) { // 处理获取ID失败的情况,比如弹个提示 alert('获取文件夹ID失败:' + error.message); }) .getSpreadsheetParentFolderId(); }); // 你的上传初始化函数,所有依赖uploadParentFolderId的逻辑都放在这里 function initUploadProcess() { // 这里写你原来的上传逻辑,比如监听文件选择、分块上传等 // 比如:document.getElementById('fileInput').addEventListener('change', handleFileUpload); // 注意:所有用到uploadParentFolderId的地方,都要确保这个变量已经被赋值 } // 你的其他上传相关函数,比如分块上传的核心逻辑 // 示例: function handleFileUpload(event) { const files = event.target.files; for (let i = 0; i < files.length; i++) { // 这里就可以用uploadParentFolderId作为上传的目标文件夹ID了 uploadFileToDrive(files[i], uploadParentFolderId); } } function uploadFileToDrive(file, parentFolderId) { // 你的分块上传逻辑,这里使用parentFolderId作为父文件夹 // ... 原来的上传代码,把之前硬编码的uploadParentFolderId替换成这个参数即可 } </script>
关键注意点
- 一定要确保所有依赖文件夹ID的上传逻辑,都在拿到ID之后再执行(也就是放在
withSuccessHandler的回调里或者initUploadProcess函数里),不然会因为uploadParentFolderId未定义导致上传失败。 - 如果你的表格被移动到多个父文件夹(虽然Drive里这种情况很少见),
getParents()会返回所有父文件夹,这里我们取第一个,你可以根据需求调整。
这样修改后,应该就能正常获取到表格所在的文件夹ID,并且把文件上传到对应的位置啦~
备注:内容来源于stack exchange,提问作者Tyrone Hirt
相关产品推荐
相关产品推荐

