Google Apps Script中UrlFetchApp返回数据无法被Utilities.parseCsv正确解析的问题排查
问题分析与解决方案
看起来你遇到的核心问题是:Cloud Run返回的字符串里的换行符是字面量\n(即反斜杠+n两个字符),而非真正的换行符,导致Utilities.parseCsv无法识别行分隔符,把整个内容当成了一行,所以日志输出数组长度为1。
为什么复制到临时变量就能正常工作?
当你把日志里的内容手动复制到temp变量时,JavaScript会自动将字符串字面量里的\n解析成真正的换行符;但通过UrlFetchApp获取的responseString里,\n是Cloud Run返回的原始字面量字符(因为Python代码里误用了原始字符串语法),实际存储的是\\n,自然无法被parseCsv识别为行分隔符。
解决方案1:从源头修复Python代码(推荐)
你的Python脚本里用了r"\n"这种原始字符串写法,会把反斜杠当成普通字符,导致返回的字符串没有真正的换行。把换行符改成普通的"\n"即可:
@app.route("/") def hello_world(): driver.get("https://www.asxlistedcompanies.com/") soup = BeautifulSoup(driver.page_source, 'html.parser') long_string = "" limit = 1 for row in soup.select('tr'): if limit == 20: break tds = [td.a.get_text(strip=True) if td.a else td.get_text(strip=True) for td in row.select('td')] # 用制表符拼接列,再添加真正的换行符 long_string += "\t".join(tds) + "\n" limit += 1 return long_string
修改后,返回的字符串会包含真正的换行符,Utilities.parseCsv就能正确拆分出18行数据。
解决方案2:在Google Apps Script中临时修复字符串
如果暂时无法修改Cloud Run的代码,也可以在GAS里把字面量\n替换成真正的换行符:
function myFunction() { const token = ScriptApp.getIdentityToken(); const options = { headers: {'Authorization': 'Bearer ' + token} } var responseString = UrlFetchApp.fetch("https://*myfunction*.a.run.app", options).getContentText(); // 全局替换字面量\n为真正的换行符 responseString = responseString.replace(/\\n/g, "\n"); var data = Utilities.parseCsv(responseString, '\t'); Logger.log(data.length); // 现在应该输出18 }
额外优化建议
Python里用循环拼接字符串效率较低,推荐用列表收集每行内容,最后统一拼接:
@app.route("/") def hello_world(): driver.get("https://www.asxlistedcompanies.com/") soup = BeautifulSoup(driver.page_source, 'html.parser') rows = [] limit = 1 for row in soup.select('tr'): if limit == 20: break tds = [td.a.get_text(strip=True) if td.a else td.get_text(strip=True) for td in row.select('td')] rows.append("\t".join(tds)) limit += 1 # 用换行符拼接所有行 return "\n".join(rows)
这样代码更简洁,性能也更优。
内容的提问来源于stack exchange,提问作者BlueBell
相关产品推荐
相关产品推荐

