转移Google Sheets所有权后,脚本创建文件为何仍归属原开发者?
问题描述
我开发了一个关联Google Apps Script的Google表格,脚本可在Google Drive中创建文件,已更新清单文件appsscript.json。我自己运行脚本时,创建的文件归我所有,符合预期。完成开发后,我把表格所有权转移给了另一个独立谷歌账号的最终所有者,对方已接受所有权。
但现在的问题是:该用户使用表格触发文件创建时,生成的文件所有者仍然是我。
我的疑问:
- 为何文件所有权未随表格所有权转移?新旧所有者都认可流程。
- 有没有办法让脚本创建的文件归属表格当前所有者?
相关信息
- 脚本核心创建文件方法:
Folder.createFile(fileName, fileContent, mimeType) appsscript.json的oauthScopes配置:
"oauthScopes": [ "https://www.googleapis.com/auth/script.external_request", "https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/spreadsheets.readonly", "https://www.googleapis.com/auth/spreadsheets", "https://www.googleapis.com/auth/script.container.ui" ]
操作流程
- 在自己账号中编写表格及脚本
- 将表格所有权转移给最终所有者
- 所有者通过复选框+可安装触发器触发函数
- 预期:创建的文件属于表格新所有者
- 实际:创建的文件仍属于我(原开发者)
核心函数代码
function saveEntityIntoGDrivePDF(entitySheet) { const entitysBook = SpreadsheetApp.getActiveSpreadsheet(); const paramSheet = entitysBook.getSheetByName("Paramètres généraux"); const entitysStorageFolderOnGDriveId = paramSheet.getRange('B30').getValue(); const entitysStorageFolderOnGDrive = DriveApp.getFolderById(entitysStorageFolderOnGDriveId); const authorizationToken = ScriptApp.getOAuthToken(); const exportLink = "https://docs.google.com/spreadsheets/d/"+entitysBook.getId()+"/export?format=pdf&size=a4&portrait=true&scale=4&top_margin=1.00&bottom_margin=1.00&left_margin=0.50&right_margin=0.50&gridlines=false&printnotes=false&pageorder=2&horizontal_alignment=CENTER&vertical_alignment=TOP&printtitle=false&sheetnames=false&fzr=false&fzc=false&attachment=false&r1=0&r2=40&c1=1&c2=6&gid="+entitySheet.getSheetId(); const year = entitySheet.getRange('J5').getValue(); const month = entitySheet.getRange('N6').getValue(); const entityIndex = entitySheet.getRange('J7').getValue(); const exportParams = { method:"GET", headers:{Authorization:"Bearer "+authorizationToken}, muteHttpExceptions:true }; const entityOk = entitySheet.getRange('K26').getValue(); var success; var entityPDFFileName = ""; if ( entityOk ) { entityPDFFileName = "Entity_OK_"+year+"_"+month+"_"+entityIndex+".pdf"; } else { entityPDFFileName = "Entity_"+year+"_"+month+"_"+entityIndex+".pdf"; } if ( !driveFileExists(entitysStorageFolderOnGDrive,entityPDFFileName) ) { var entityPDFContent = UrlFetchApp.fetch(exportLink, exportParams).getBlob().setName(entityPDFFileName); entitysStorageFolderOnGDrive.createFile(entityPDFFileName, entityPDFContent, MimeType.PDF); success = true; } else { success = false; } return success; }
解答
1. 所有权未转移的原因
这是因为可安装触发器的执行身份是创建触发器的用户——也就是你(原开发者)。即使表格所有权转移,已存在的可安装触发器仍保留原创建者的身份权限,脚本会以你的账号身份运行,所以创建的文件所有者是你。
另外,脚本中ScriptApp.getOAuthToken()获取的是触发器执行身份的令牌(即你的账号令牌),后续通过UrlFetchApp导出PDF时也是用你的权限,最终创建的文件自然归你所有。
2. 让文件归属表格所有者的解决方案
方案一:由新所有者重新创建可安装触发器
让最终所有者登录自己的账号,打开表格后删除原有的可安装触发器,重新创建相同的触发器。这样触发器的执行身份就变成新所有者,脚本会以他的账号权限运行,创建的文件所有权就会归属他。
方案二:调整脚本执行逻辑
如果无法让用户手动创建触发器,可以尝试:
- 改用简单触发器(比如
onEdit),但简单触发器有30秒执行时间限制,若PDF导出逻辑复杂可能不适用; - 避免使用
ScriptApp.getOAuthToken(),改用DriveApp原生方法处理文件操作,同时确保触发器由新所有者创建。
另外需确认:DriveApp.getFolderById获取的文件夹对新所有者有编辑权限,确保他能在该文件夹下创建文件。
内容的提问来源于stack exchange,提问作者Emmanuel Franquemagne
相关产品推荐
相关产品推荐

