You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google App Script中如何在UrlFetch间传递会话数据并实现登录下载CSV?

问题修复与完整实现方案

你的登录脚本里有几个关键错误,导致凭证无法正确提交,下面是问题排查和修正后的代码:

关键错误点

  1. 参数格式错误:构造payload时,__RequestVerificationToken后面少了=号,应该写成__RequestVerificationToken=${token},不然服务器识别不了这个参数。
  2. 请求方法未指定:第二个登录请求没设置POST方法,默认是GET,根本传不了表单数据。
  3. 冗余代码无效:staticToken完全没必要,直接用token即可;两次构造payload属于重复操作。
  4. token存储代码失效:parseWebsiteForToken里return tokenValue之后的代码不会执行,存token到PropertiesService的语句要挪到return前面。
  5. payload拼接易踩坑:手动拼接字符串如果遇到用户名/密码带特殊字符(比如&、空格)会直接报错,用对象形式让UrlFetchApp自动处理编码更靠谱。
  6. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 03:35:32