基于单元格值禁用Google Sheets按钮及脚本执行时保持禁用求助
Google Apps Script 按钮禁用逻辑实现
针对你的需求,以下是修改后的完整脚本,同时满足D1单元格值为1时禁用按钮和脚本执行期间保持按钮禁用两个要求:
function adm() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const stdSheet = ss.getSheetByName("STD"); // 检查D1单元格值,若为1则直接退出,禁用按钮功能 const d1Value = stdSheet.getRange("D1").getValue(); if (d1Value === 1) return; const mainFunctionName = "adm"; const alertFunctionName = "alert1"; const drawings = stdSheet.getDrawings(); const targetDrawing = drawings.filter(d => d.getOnAction() === mainFunctionName); if (targetDrawing.length !== 1) return; try { // 执行前切换按钮触发函数为提示函数,实现禁用效果 targetDrawing[0].setOnAction(alertFunctionName); SpreadsheetApp.flush(); // 立即刷新界面,确保按钮状态生效 sd(); // 执行核心数据转移逻辑 } finally { // 无论执行成功或失败,都恢复按钮原有触发函数(仅当D1不为1时) if (d1Value !== 1) { targetDrawing[0].setOnAction(mainFunctionName); SpreadsheetApp.flush(); } } } function alert1() { SpreadsheetApp.getUi().alert("数据正在处理中,请稍候..."); } function sd() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const pt = ss.getSheetByName("STD"); const pcons = ss.getSheetByName("INDEX1"); const clr1 = ["F15:I34"]; const pt1 = ["B1", "B8", "B9"]; // 修正原代码解构列数不匹配问题:A15:T34为20列,对应20个变量解构 const vs = pt.getRange("A15:T34").getValues().map(([a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t]) => [k, a, b, c, d, e, f, g, h, i, j]); pcons.getRange(pcons.getLastRow() + 1, 1, vs.length, vs[0].length).setValues(vs); pt1.forEach(f => pt.getRange(f).clearContent()); clr1.forEach(f => pt.getRange(f).clearContent()); }
关键修改说明
- D1值拦截:函数开头直接检查STD工作表D1单元格的值,等于1时直接终止执行,实现按钮禁用效果。
- 执行期间锁定:用
try...finally块确保脚本无论成功或报错,都能恢复按钮状态;执行前将按钮触发函数切换到提示函数,此时点击按钮只会弹出提示,无法重复触发核心逻辑。 - 修复解构错误:原代码中
A15:T34是20列数据,但解构时写了22个变量,会导致运行报错,已修正为对应20列的解构逻辑。 - 即时刷新界面:调用
SpreadsheetApp.flush()强制刷新界面,确保按钮状态的修改立即生效,避免延迟。
内容的提问来源于stack exchange,提问作者Supply Chain Team
相关产品推荐
相关产品推荐

