我正在尝试为 Google 表格编写一个自定义函数,该函数将访问地下天气的历史天气数据并返回温度。数据位于全部由逗号分隔的 UTF-8 文本的网页中。每行的第一项是时间,第二项是温度。该函数将以日期-DD、月份-MM、年份-YYYY、时间-HH:MM AM(或PM)的形式接受输入。我需要进入网页,找到与输入相同的小时的行(所有数据都是在该小时的第53分钟获取的),并返回当时的温度。
这是我第一次使用 javascript 式编码,我认为我打开和解码网页的方式不正确。在谷歌表格中,它说 TEMP 是一个未知函数。谢谢。
function TEMP(day, month, year, time) {
var newTime = String(time).split("");
if(String(newTime[6]).localeCompare('A')){
var newTime1 = newTime[0] + newTime[1] + ":53 AM";
}
else if(String(time[6]).localeCompare('P')){
newTime1 = newTime[0] + newTime[1] + ":53 PM";
}
else{
}
try{
var url = "https://www.wunderground.com/history/airport/KTVR/" + year +"/" + month + "/" + day + "/DailyHistory.html?format=1";
}
catch(err){
return "weather data not found"
}
var opened = decodeURI(UrlFetchApp.fetch(url));
for each(var line in opened){
var newLine = String(line).split(',');
if(newLine[0] == newTime1){
return newLine[1];
}
else{
}
}
return "sorry something went wrong";
}
最佳答案
这里的主要错误是关于 UrlFetchApp.fetch
的错误假设。返回。我建议仔细阅读文档。此方法返回类 HTTPResponse 的对象。人们通常想要从这个对象中得到的是 getContentText()
,它返回一个包含网页源标记的字符串。可以用换行符分割得到一个数组;仅通过在打开的内容中写入 var line
不会自行发生这种情况。
在此对象上使用 decodeURI
是没有意义的。该函数用于解码表示 URI 的字符串,例如
decodeURI("https://developer.mozilla.org/ru/docs/JavaScript_%D1%88%D0%B5%D0%BB%D0%BB%D1%8B");
它是关于解码网页地址,而不是其内容。
此外,您在 try-catch block 中放置了错误的内容。在字符串连接步骤中不会引发任何错误。获取数据时很可能会出现错误;您可能需要查看 fetch
方法的 muteHttpExceptions
选项。
无论如何,去掉空的 else {}
block ,它们有什么用?
对脚本进行以下更改后,
var url = "https://www.wunderground.com/history/airport/KTVR/" + year +"/" + month + "/" + day + "/DailyHistory.html?format=1";
var opened = UrlFetchApp.fetch(url).getContentText().split('\n');
我能够在电子表格中使用 =temp(2,3,2016,"12:34 am")
;它返回 52.0。
关于javascript - 在 Google Apps 脚本自定义函数中访问和抓取逗号分隔的 UTF-8 文本网页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41350487/