Google App Script中如何在UrlFetch间传递会话数据并实现登录下载CSV?
问题修复与完整实现方案
你的登录脚本里有几个关键错误,导致凭证无法正确提交,下面是问题排查和修正后的代码:
关键错误点
- 参数格式错误:构造payload时,
__RequestVerificationToken后面少了=号,应该写成__RequestVerificationToken=${token},不然服务器识别不了这个参数。 - 请求方法未指定:第二个登录请求没设置
POST方法,默认是GET,根本传不了表单数据。 - 冗余代码无效:
staticToken完全没必要,直接用token即可;两次构造payload属于重复操作。 - token存储代码失效:
parseWebsiteForToken里return tokenValue之后的代码不会执行,存token到PropertiesService的语句要挪到return前面。 - payload拼接易踩坑:手动拼接字符串如果遇到用户名/密码带特殊字符(比如&、空格)会直接报错,用对象形式让UrlFetchApp自动处理编码更靠谱。
- Cookie处理不周全:
Set-Cookie可能返回多个值,得用分号把它们拼接起来。
修正后的完整代码(包含CSV下载+更新Sheets)
function loginAndDownloadCSV() { const loginUrl = "http://portal.scaleinsights.com"; // 注意:如果登录表单的action不是这个地址,要换成实际接口URL const username = "你的用户名"; const password = "你的密码"; const sheetId = "你的Google表格ID"; const sheetName = "目标工作表名称"; const csvDownloadUrl = "http://portal.scaleinsights.com/实际CSV下载地址"; // 从浏览器开发者工具获取 // 第一步:获取登录页面的验证Token和初始Cookie const initialRes = UrlFetchApp.fetch(loginUrl); const html = initialRes.getContentText(); const token = parseWebsiteForToken(html); if (!token) { Logger.log("找不到__RequestVerificationToken,登录失败"); return; } // 处理多Cookie情况 const cookies = initialRes.getAllHeaders()['Set-Cookie'] || []; const cookieStr = Array.isArray(cookies) ? cookies.join('; ') : cookies; // 构造登录请求参数(用对象自动处理编码) const loginPayload = { 'Input.UserName': username, 'Input.Password': password, 'Input.RememberMe': false, '__RequestVerificationToken': token }; // 登录请求配置 const loginOpts = { method: "POST", headers: { 'Cookie': cookieStr, 'Content-Type': 'application/x-www-form-urlencoded' }, payload: loginPayload, followRedirects: true, muteHttpExceptions: true // 方便查看错误日志 }; // 执行登录 const loginRes = UrlFetchApp.fetch(loginUrl, loginOpts); const loginHeaders = loginRes.getAllHeaders(); // 验证登录状态(可结合响应内容判断,比如是否包含用户名) Logger.log("登录响应码: " + loginRes.getResponseCode()); Logger.log("登录后Cookie: " + loginHeaders['Set-Cookie']); // 登录成功后下载CSV const csvOpts = { headers: { 'Cookie': loginHeaders['Set-Cookie'] || cookieStr }, muteHttpExceptions: true }; const csvRes = UrlFetchApp.fetch(csvDownloadUrl, csvOpts); const csvText = csvRes.getContentText(); // 把CSV写入Google Sheets const sheet = SpreadsheetApp.openById(sheetId).getSheetByName(sheetName); const csvData = Utilities.parseCsv(csvText); sheet.clearContents(); sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData); Logger.log("CSV已成功更新到表格"); } function parseWebsiteForToken(html) { const tokenRegex = /<input\s+name="__RequestVerificationToken"\s+type="hidden"\s+value="([^"]+)"/i; const match = html.match(tokenRegex); if (match && match.length > 1) { const tokenValue = match[1]; // 先存token再返回 PropertiesService.getUserProperties().setProperty('verificationToken', tokenValue); return tokenValue; } else { Logger.log("未找到验证Token"); return null; } }
额外提醒
- 确认登录接口URL:打开登录页面右键查看源代码,找到
<form>标签的action属性,若和当前URL不一致,替换掉代码里的loginUrl。 - 获取CSV下载地址:登录后用浏览器开发者工具(F12)的网络面板,点击下载CSV按钮,找到对应请求的URL替换
csvDownloadUrl。 - 首次运行需授权:Google会提示授权脚本访问外部网站和修改表格,按步骤同意即可。
- 优化登录验证:可以检查登录后的响应HTML是否包含用户名或“登录成功”字样,比仅看状态码更准确。
内容的提问来源于stack exchange,提问作者Kran
相关产品推荐
相关产品推荐

