Google Apps Script运行自动复制表格,触发器/部署疑存问题
问题根源与解决办法
核心问题
你用Web App部署来实现表格打开触发函数,这是错误的选择。Web App在云端独立运行时,默认会自动创建原表格的副本进行操作,这就是每次运行都生成副本的原因——它根本没在你打开的原表格上执行代码。
解决步骤
1. 先删掉无用的Web App部署
- 打开脚本编辑器,点右上角「部署」→「管理部署」
- 找到已有的Web App部署,点右侧三个点→「停用」,彻底移除这个部署
2. 用正确的触发方式实现“打开表格自动执行”
有两种简单方式可选:
方式一:用简单触发器(无需额外授权)
直接把函数名改成onOpen,Google会自动把它识别为表格打开时触发的函数:
function onOpen() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var s_week = ss.getSheetByName("Quick view - Week"); var s_month = ss.getSheetByName("Quick view - Month"); var test = ss.getSheetByName("Test"); var currentWeek = Utilities.formatDate(new Date(), "GMT", "w"); console.log(currentWeek); }
注:简单触发器不能调用需要授权的服务,但你当前的代码完全适用。
方式二:用可安装触发器(支持后续扩展授权操作)
如果之后你的函数需要调用邮件、外部API这类需要授权的服务,就用这种方式:
- 打开脚本编辑器,点左侧的时钟图标(触发器面板)
- 点「添加触发器」,按以下配置:
- 要运行的函数:选
mediaplan - 部署来源:选「从电子表格」
- 事件类型:选「打开时」
- 要运行的函数:选
- 保存并完成授权流程即可
3. 代码小优化(可选)
你重复调用了多次SpreadsheetApp.getActiveSpreadsheet(),可以改成只调用一次,让代码更高效:
function mediaplan() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var s_week = ss.getSheetByName("Quick view - Week"); var s_month = ss.getSheetByName("Quick view - Month"); var test = ss.getSheetByName("Test"); var currentWeek = Utilities.formatDate(new Date(), "GMT", "w"); console.log(currentWeek); }
内容的提问来源于stack exchange,提问作者Lara Moric
相关产品推荐
相关产品推荐

