外部网站调用已发布Google Apps Script自定义函数的实现方法咨询
问题解答
1. 是否支持从外部网站直接调用Apps Script自定义函数?
不支持。Google Apps Script发布为Web服务时,仅对外暴露doGet()和doPost()两个固定入口函数,你自行定义的其他函数(比如你写的deleteunder1minutepassengerinput2())无法被外部请求直接调用,所有外部逻辑都需要通过这两个入口函数中转。
2. 如何调用目标删除函数?
你只需要修改doPost()逻辑,增加请求参数判断,根据不同的参数执行对应的操作即可,具体修改步骤如下:
步骤1:修改Google Apps Script代码
首先优化删除函数的表格获取逻辑(避免Web App运行时获取活动表格异常),再修改doPost()增加操作判断:
var sheetName = 'Mulawin' var scriptProp = PropertiesService.getScriptProperties() function intialSetup () { var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet() scriptProp.setProperty('key', activeSpreadsheet.getId()) } function doPost (e) { var lock = LockService.getScriptLock() lock.tryLock(10000) try { var doc = SpreadsheetApp.openById(scriptProp.getProperty('key')) var sheet = doc.getSheetByName(sheetName) // 新增:判断请求的操作类型 var action = e.parameter.action if(action === 'delete') { // 调用删除函数 deleteunder1minutepassengerinput2(doc) return ContentService .createTextOutput(JSON.stringify({ 'result': 'success', 'msg': '删除操作执行完成' })) .setMimeType(ContentService.MimeType.JSON) } // 原有表单提交逻辑 var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0] var nextRow = sheet.getLastRow() + 1 var newRow = headers.map(function(header) { return header === 'Timestamp' ? new Date() : e.parameter[header] }) sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow]) return ContentService .createTextOutput(JSON.stringify({ 'result': 'success', 'row': nextRow })) .setMimeType(ContentService.MimeType.JSON) } catch (e) { return ContentService .createTextOutput(JSON.stringify({ 'result': 'error', 'error': e.toString() })) .setMimeType(ContentService.MimeType.JSON) } finally { lock.releaseLock() } } // 优化删除函数,直接传入已打开的表格对象 function deleteunder1minutepassengerinput2(doc) { var sheet = doc.getSheetByName('Mulawin'); var rows = sheet.getDataRange(); var numRows = rows.getNumRows(); var values = rows.getValues(); var rowsDeleted = 0; for (var i = 0; i <= numRows-1 ; i++) { var row = values[i]; if (row[32] == 'delete') { sheet.deleteRow((parseInt(i)+1) - rowsDeleted); rowsDeleted++; } } }
修改完成后需要重新发布新版本的Web App,否则修改不会生效。
步骤2:前端调用删除函数的代码示例
你可以在前端页面添加触发删除的逻辑,比如绑定按钮点击事件发送带action=delete参数的POST请求:
// 触发删除操作的示例代码 function triggerDelete() { const scriptURL = '你的Web App地址' const formData = new FormData() formData.append('action', 'delete') fetch(scriptURL, { method: 'POST', body: formData}) .then(res => res.json()) .then(data => { console.log('删除完成', data) // 这里可以加你自己的后续逻辑,比如提示用户操作完成 }) .catch(error => console.error('删除出错', error.message)) }
你原有提交表单的逻辑不需要修改,还是可以正常使用。
注意事项
- Web App的权限需要设置为「任何人,甚至匿名用户」才能被外部网站正常调用
- 每次修改Apps Script代码后,都需要部署新的版本,不能只点击保存按钮
- 如果需要限制删除操作的调用权限,可以在代码里加校验逻辑,比如校验请求里的秘钥参数,避免被恶意调用
内容的提问来源于stack exchange,提问作者Erwin Manalang
相关产品推荐
相关产品推荐

