如何在Laravel/PHP中调用Google Apps Script获取指定Google Form响应?
解决方案:通过Google Apps Script + Laravel 获取Google Form响应(含上传文件)
我之前在Laravel项目里也碰到过一模一样的问题,那个老包确实早就不兼容了,后来摸索出用Google Apps Script(GAS)做中间层的方案,完美解决了获取表单响应和上传文件的需求,给你一步步拆解:
第一步:编写Google Apps Script作为数据接口
首先得在GAS里写一个脚本,用来读取指定Google Form的响应,包括用户上传的文件信息。
- 打开你的Google Form,点击右上角的「扩展程序」→「Apps Script」,进入脚本编辑器。
- 替换默认代码为以下内容:
function getFormResponses() { // 替换成你的Google Form ID(从表单URL里获取,比如https://docs.google.com/forms/d/[FORM_ID]/edit) const formId = "你的表单ID"; const form = FormApp.openById(formId); const responses = form.getResponses(); const result = []; responses.forEach(response => { const responseItem = { timestamp: response.getTimestamp(), responses: [] }; response.getItemResponses().forEach(itemResponse => { const item = itemResponse.getItem(); const responseData = { question: item.getTitle(), answer: itemResponse.getResponse() }; // 处理文件上传类型的问题 if (item.getType() === FormApp.ItemType.FILE_UPLOAD) { const fileIds = itemResponse.getResponse(); const files = fileIds.map(fileId => { const file = DriveApp.getFileById(fileId); return { fileName: file.getName(), fileUrl: file.getDownloadUrl(), // 获取文件直接下载链接 fileId: fileId }; }); responseData.answer = files; } responseItem.responses.push(responseData); }); result.push(responseItem); }); // 返回JSON格式的数据,方便Laravel解析 return ContentService.createTextOutput(JSON.stringify(result)) .setMimeType(ContentService.MimeType.JSON); }
- 保存脚本,命名比如「FormResponseAPI」。
第二步:部署GAS为Web App
这一步是让Laravel能通过HTTP请求访问这个脚本:
- 在脚本编辑器里点击「部署」→「新部署」。
- 点击齿轮图标,选择「Web应用」。
- 配置选项:
- 执行:选择「我」(因为脚本需要访问你的表单和Drive文件)
- 谁可以访问:根据你的需求选,比如「任何人,甚至匿名」(如果是公开表单的话),或者「仅限组织内用户」
- 点击「部署」,然后复制生成的Web App URL,这个就是Laravel要调用的接口地址。
第三步:在Laravel里调用GAS接口
在Laravel项目里,你可以用Http facade来发送GET请求获取数据:
- 在控制器或者服务类里写调用代码:
use Illuminate\Support\Facades\Http; public function getGoogleFormResponses() { // 替换成你刚才生成的GAS Web App URL $gasUrl = "你的GAS Web App URL"; try { $response = Http::get($gasUrl); $responses = $response->json(); // 这里可以对获取到的响应数据进行处理,比如存入数据库或者返回给前端 return response()->json($responses); } catch (\Exception $e) { return response()->json(['error' => '获取表单响应失败:' . $e->getMessage()], 500); } }
- 可以给这个方法加个路由,方便测试或者调用。
注意事项
- 权限问题:如果GAS提示没有访问Drive的权限,需要在脚本编辑器里先运行一次
getFormResponses函数,会弹出授权提示,点击允许即可。 - 文件访问限制:如果用户上传的文件是限制仅表单所有者能访问,那GAS获取的下载链接只有你能打开;如果需要让Laravel的用户也能访问,得调整文件的共享权限(比如设置为「知道链接的任何人可查看」)。
- 响应时间:如果表单响应非常多,GAS的执行时间可能会超时(默认6分钟),可以考虑分页获取响应,比如用
getResponses(startIndex, endIndex)来分批处理。
内容的提问来源于stack exchange,提问作者T-prod
相关产品推荐
相关产品推荐

