在 Google 个工作表中使用应用程序脚本获取网站数据
Fetch website data using app scripts in Google sheets
早些时候我问了一个关于在 Google 表格中使用 =IMPORTXML 函数获取数据的问题。现在我已经开始工作了,但我明白脚本可以更好地工作以提高可靠性和可用性。
当前脚本(见下文)的问题是它只能从一个 url 获取数据。我想从多个 url 导入数据(每个国家/地区都有自己独特的 url)。我想为每个 URL 获取多个数据。这一切都与荷兰政府到其他国家的旅行建议有关。在我的 spreadsheet 中,我在 A 中添加了一个包含唯一 URL 的列,在 B 中添加了普通的 tekst 国家,在 C、D 和 E 列中添加了要获取的数据。
我要获取的数据
- 颜色状态(Geel、Oranje、Rood)
[can be found within <h3></h3>]
- mapurl(.png 文件的 url,地图包括旅行建议)
[can be found within <paragraph></paragraph>]
- summary(当前旅行建议的总结)
[can be found within <summary></summary>]
我希望你能帮助我改进脚本,以便更容易地从政府获取 'traveladvice' 数据。
function parseXml() {
var url = 'https://opendata.nederlandwereldwijd.nl/v1/sources/nederlandwereldwijd/infotypes/traveladvice/a790e247-8ff8-4aa8-be93-9202ccaa180a';
var xml = UrlFetchApp.fetch(url).getContentText();
var document = XmlService.parse(xml);
str = xml.split("<paragraphtitle>Veiligheidsrisico’s</paragraphtitle>")[1]
mySubString = str.match(new RegExp("<summary>" + "(.*)" + "</summary>"))[1];
return mySubString;
}
(脚本来自:Marios,感谢 Marios!)然后在电子表格的单元格内 =parseXml()
以获取数据。
解决方案:
您可以使用以下三个自定义函数:
function parseXmlSummary(url) {
try{
var xml = UrlFetchApp.fetch(url).getContentText();
mySubString = xml.match(new RegExp("<summary>" + "(.*)" + "</summary>"))[1];
return mySubString;
}
catch(e){return "";}
}
function parseXmlMapURL(url) {
try{
var xml = UrlFetchApp.fetch(url).getContentText();
mySubString = "https://"+xml.match(new RegExp("CDATA\[https://" + "(.*)" + ".png"))[1]+".png";
return mySubString;
}
catch(e){return "";}
}
function parseXmlColours(url) {
try{
var xml = UrlFetchApp.fetch(url).getContentText();
str = xml.split("<paragraphtitle>Veiligheidsrisico’s</paragraphtitle>")[1]
var colours = ['Geel', 'Oranje', 'Rood'];
res_colour = colours.filter(c => str.includes(c))[0];
return res_colour;
}
catch(e){return "";}
}
然后你可以像这样分别调用它们:
=parseXmlSummary(A7)
=parseXmlMapURL(A7)
=parseXmlColours(A7)
假设单元格 A7 包含给定的 URL.
对于下面的所有其他单元格(A8、A9、..),您可以像往常一样向下拖动公式与其他公式。
早些时候我问了一个关于在 Google 表格中使用 =IMPORTXML 函数获取数据的问题。现在我已经开始工作了,但我明白脚本可以更好地工作以提高可靠性和可用性。
当前脚本(见下文)的问题是它只能从一个 url 获取数据。我想从多个 url 导入数据(每个国家/地区都有自己独特的 url)。我想为每个 URL 获取多个数据。这一切都与荷兰政府到其他国家的旅行建议有关。在我的 spreadsheet 中,我在 A 中添加了一个包含唯一 URL 的列,在 B 中添加了普通的 tekst 国家,在 C、D 和 E 列中添加了要获取的数据。
我要获取的数据
- 颜色状态(Geel、Oranje、Rood)
[can be found within <h3></h3>]
- mapurl(.png 文件的 url,地图包括旅行建议)
[can be found within <paragraph></paragraph>]
- summary(当前旅行建议的总结)
[can be found within <summary></summary>]
我希望你能帮助我改进脚本,以便更容易地从政府获取 'traveladvice' 数据。
function parseXml() {
var url = 'https://opendata.nederlandwereldwijd.nl/v1/sources/nederlandwereldwijd/infotypes/traveladvice/a790e247-8ff8-4aa8-be93-9202ccaa180a';
var xml = UrlFetchApp.fetch(url).getContentText();
var document = XmlService.parse(xml);
str = xml.split("<paragraphtitle>Veiligheidsrisico’s</paragraphtitle>")[1]
mySubString = str.match(new RegExp("<summary>" + "(.*)" + "</summary>"))[1];
return mySubString;
}
(脚本来自:Marios,感谢 Marios!)然后在电子表格的单元格内 =parseXml()
以获取数据。
解决方案:
您可以使用以下三个自定义函数:
function parseXmlSummary(url) {
try{
var xml = UrlFetchApp.fetch(url).getContentText();
mySubString = xml.match(new RegExp("<summary>" + "(.*)" + "</summary>"))[1];
return mySubString;
}
catch(e){return "";}
}
function parseXmlMapURL(url) {
try{
var xml = UrlFetchApp.fetch(url).getContentText();
mySubString = "https://"+xml.match(new RegExp("CDATA\[https://" + "(.*)" + ".png"))[1]+".png";
return mySubString;
}
catch(e){return "";}
}
function parseXmlColours(url) {
try{
var xml = UrlFetchApp.fetch(url).getContentText();
str = xml.split("<paragraphtitle>Veiligheidsrisico’s</paragraphtitle>")[1]
var colours = ['Geel', 'Oranje', 'Rood'];
res_colour = colours.filter(c => str.includes(c))[0];
return res_colour;
}
catch(e){return "";}
}
然后你可以像这样分别调用它们:
=parseXmlSummary(A7)
=parseXmlMapURL(A7)
=parseXmlColours(A7)
假设单元格 A7 包含给定的 URL.
对于下面的所有其他单元格(A8、A9、..),您可以像往常一样向下拖动公式与其他公式。