You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

转移Google Sheets所有权后,脚本创建文件为何仍归属原开发者?

问题描述

我开发了一个关联Google Apps Script的Google表格,脚本可在Google Drive中创建文件,已更新清单文件appsscript.json。我自己运行脚本时,创建的文件归我所有,符合预期。完成开发后,我把表格所有权转移给了另一个独立谷歌账号的最终所有者,对方已接受所有权。

但现在的问题是:该用户使用表格触发文件创建时,生成的文件所有者仍然是我。

我的疑问:

  1. 为何文件所有权未随表格所有权转移?新旧所有者都认可流程。
  2. 有没有办法让脚本创建的文件归属表格当前所有者?

相关信息

  • 脚本核心创建文件方法: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 03:12:03