如何在Manychat应用JSON文件中实现类似Google Sheets Manychat应用的关联式设置功能?普通用户是否具备实现权限?
嘿,这个需求我之前帮朋友实现过,刚好能给你详细说说怎么在Manychat应用的JSON里配置出这种联动选择的功能,还有普通用户能不能搞定~
实现Manychat Google Sheets应用的联动选择(表格→工作表)
核心思路:动态下拉菜单+依赖字段
要实现选完电子表格再选对应工作表的联动,关键是用Manychat设置项里的dynamic_options(动态选项)和depends_on(依赖字段)属性,再结合Google Sheets API动态拉取数据。
具体JSON配置示例
下面是Manychat应用JSON文件中settings和oauth部分的核心代码,我标了关键注释方便你理解:
{ "settings": [ // 第一个选择框:选择电子表格 { "type": "select", "name": "spreadsheet_id", "label": "选择你的Google电子表格", "options": { "dynamic_options": { // 替换为你用来获取用户所有表格的API端点URL "url": "https://your-api-endpoint.com/get-spreadsheets", "method": "GET", // 携带OAuth令牌,验证用户身份并访问其Google数据 "headers": { "Authorization": "Bearer {{oauth_access_token}}" } } }, "required": true }, // 第二个选择框:选择对应工作表(依赖第一个选择框) { "type": "select", "name": "worksheet_id", "label": "选择该表格下的工作表", "options": { "dynamic_options": { // 替换为获取指定表格下工作表的API端点,用{{settings.spreadsheet_id}}引用之前选中的表格ID "url": "https://your-api-endpoint.com/get-worksheets?spreadsheet_id={{settings.spreadsheet_id}}", "method": "GET", "headers": { "Authorization": "Bearer {{oauth_access_token}}" } } }, "required": true, // 设置依赖:只有选了电子表格才显示这个选择框 "depends_on": { "field": "spreadsheet_id", "operator": "not_empty" } } ], // 必须配置OAuth2授权,才能访问用户的Google Sheets "oauth": { "client_id": "你的Google OAuth客户端ID", "client_secret": "你的Google OAuth客户端密钥", "scopes": [ "https://www.googleapis.com/auth/spreadsheets.readonly" // 只读权限足够,如需修改可换对应scope ], "auth_url": "https://accounts.google.com/o/oauth2/auth", "token_url": "https://oauth2.googleapis.com/token" } }
怎么实现动态选项的API端点?
普通用户不用自己搭服务器,用Google Apps Script就能搞定——它可以直接调用Google Sheets/Drive API,还能部署成Web App当API用:
步骤1:编写Google Apps Script代码
打开Google Apps Script,新建一个项目,粘贴下面的代码:
function doGet(e) { const accessToken = e.parameter.access_token; // 验证OAuth令牌(可选但推荐,防止非法请求) const service = getOAuthService(accessToken); if (!service.hasAccess()) { return ContentService.createTextOutput(JSON.stringify({error: "未授权访问"})).setMimeType(ContentService.MimeType.JSON); } // 如果请求带了spreadsheet_id,返回该表格的所有工作表 if (e.parameter.spreadsheet_id) { const spreadsheetId = e.parameter.spreadsheet_id; try { const sheets = SpreadsheetApp.openById(spreadsheetId).getSheets(); const options = sheets.map(sheet => ({ label: sheet.getName(), // 显示给用户的工作表名称 value: sheet.getSheetId().toString() // 保存的工作表ID })); return ContentService.createTextOutput(JSON.stringify(options)).setMimeType(ContentService.MimeType.JSON); } catch (err) { return ContentService.createTextOutput(JSON.stringify({error: "无法获取工作表:" + err.message})).setMimeType(ContentService.MimeType.JSON); } } // 否则返回用户的所有Google电子表格 else { const files = DriveApp.getFilesByType(MimeType.GOOGLE_SHEETS); const options = []; while (files.hasNext()) { const file = files.next(); options.push({ label: file.getName(), value: file.getId() }); } return ContentService.createTextOutput(JSON.stringify(options)).setMimeType(ContentService.MimeType.JSON); } } // 初始化OAuth服务,验证令牌合法性 function getOAuthService(accessToken) { return OAuth2.createService('Google') .setTokenUrl('https://oauth2.googleapis.com/token') .setAccessToken(accessToken); }
步骤2:部署为Web App
- 点击右上角「部署」→「新部署」
- 类型选择「Web应用」
- 执行权限选「我自己」,访问权限选「任何人,甚至匿名」(要更安全的话可以选「仅限自己」,但这样只有你能测试)
- 点击「部署」,复制生成的Web App URL,替换到Manychat JSON里的
dynamic_options.url字段即可
普通用户能实现吗?
完全可以!只要你愿意花10-20分钟研究Google Apps Script的基本操作和Manychat应用配置逻辑,不需要专业的后端开发技能。Google Apps Script是低代码工具,语法和JavaScript类似,官方文档也很详细,跟着步骤走就能搞定。
内容的提问来源于stack exchange,提问作者Timur Malyshev




