共享Google Sheet中Apps Script的msgBox/toast消息不显示求助
问题原因
服务器端的Browser.msgBox和SpreadsheetApp.toast依赖脚本运行的用户会话上下文。当通过侧边栏的google.script.run调用服务器函数时,这类UI提示只会在脚本授权执行者的会话(也就是你的账号)中显示,其他拥有编辑权限的调用用户无法看到服务器端触发的UI提示——这就是为什么你自己测试正常,共享用户看不到消息的核心原因。
解决方案
把UI提示逻辑从服务器端转移到客户端(侧边栏HTML),利用google.script.run的回调函数处理成功/失败的消息展示:
1. 修改服务器端uploadCMS函数
移除服务器端的UI提示代码,改为返回消息内容:
function uploadCMS(e){ let start = new Date() console.log(e) var CMSFile = DriveApp.getFolderById(CMSFileDirectory).createFile(Utilities.newBlob(...e)) var csvData = Utilities.parseCsv(CMSFile.getBlob().getDataAsString()); if (csvData[0][0] != 'Member Number') { // 返回错误消息,替代原msgBox return {success: false, message: "This does not look like a BSAC CMS file, did you select the correct file?"} } var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('CMS data'); sheet.deleteRows(1,sheet.getLastRow() - 1) sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData); sheet.getRange(1, 1, 1, csvData[0].length).setFontWeight("bold"); var range = sheet.getRange(2, 1, csvData.length - 1, csvData[0].length); var worksheet = SpreadsheetApp.getActive(); worksheet.setNamedRange("CMSRange", range); let ConfMessage = "CMS .csv file loaded successfully. " + String(csvData.length - 1) + " records loaded." // 返回成功消息 return {success: true, message: ConfMessage} let end = new Date() console.log((end - start)/1000 + "s") }
2. 修改侧边栏HTML的uploadCMS函数
添加回调函数接收服务器返回的消息,在客户端展示提示:
<!DOCTYPE html> <html> <a>Select a BSAC CMS .csv download file<br><br></a> <form> <input type="file" name="file" onchange="uploadCMS(this.parentNode)" accept=".csv" /> </form> <script> function uploadCMS(e){ const file = e.file.files[0]; const fr = new FileReader(); fr.onload = e => { google.script.run .withSuccessHandler(showMessage) .withFailureHandler(error => alert("Error: " + error.message)) .uploadCMS([[...new Int8Array(e.target.result)], file.type, file.name]); }; fr.readAsArrayBuffer(file); } // 客户端消息展示函数 function showMessage(response) { if (response.success) { // 自定义toast样式提示 const toast = document.createElement('div'); toast.style.cssText = 'position: fixed; bottom: 20px; right: 20px; padding: 12px 24px; background: #4CAF50; color: white; border-radius: 4px; z-index: 1000;'; toast.textContent = response.message; document.body.appendChild(toast); setTimeout(() => toast.remove(), 3000); } else { alert(response.message); } } </script> </html>
额外说明
- 即便对方是GCP项目所有者,服务器端的UI提示仍受限于会话上下文,无法跨用户显示。
google.script.run是异步通信,必须通过回调将服务器端状态传递回客户端,再处理UI交互。
内容的提问来源于stack exchange,提问作者Jim Burke
相关产品推荐
相关产品推荐

