创建 UrlFetchApp 脚本以替换 Google Sheet importHTML 函数
Creating a UrlFetchApp script to replace the Google Sheet importHTML function
我使用以下公式大约一年了,突然它停止了 working/importing table。
=IMPORTHTML("https://tradingeconomics.com/matrix";"table";1)
它给了我一个 “无法获取 url: https://tradingeconomics.com/matrix" 错误。
我尝试了各种方法,其中一个有趣的发现是 importHTML 适用于缓存版本,但仅适用于不同 Google 帐户下的新 sheet。此外,缓存版本也会随机中断。
因此,我似乎不会为了这个目的而使用脚本。
理想情况下,这个脚本应该足够灵活,它应该有一个专门的功能,例如importHTMLtable 用户可以在其中输入 URL 和 table 号。它有效。所以它适用于我目前使用的以下功能,例如
=importHTMLtable("https://tradingeconomics.com/matrix";"table";1)
或
=importHTMLtable("https://tradingeconomics.com/country-list/business-confidence?continent=world";"table";1)
或
=importHTMLtable("https://tradingeconomics.com/country-list/ease-of-doing-business";"table";1)
等...
不确定 this Github 代码是否解决了这个问题。好像只能解析文本?
我认为这是 Google 表格用户的一个相当普遍的问题,并且认为可能已经有一个 AppScript 可以做到这一点,并且在导入速度方面也可能更快。
我不会编程,所以我尝试复制和发布代码,看看是否可以让一些代码工作。运气不好:(
任何人都可以提供代码或现有的应用程序脚本(我不知道)完全可以做到这一点吗?
试试这个方法
=importTableHTML(A1,1)
和
function importTableHTML(url,n){
var html = UrlFetchApp.fetch(url,{followRedirects : true,muteHttpExceptions: true}).getContentText().replace(/(\r\n|\n|\r|\t| )/gm,"")
const tables = [...html.matchAll(/<table[\s\S\w]+?<\/table>/g)];
var trs = [...tables[n-1][0].matchAll(/<tr[\s\S\w]+?<\/tr>/g)];
var data = [];
for (var i=0;i<trs.length;i++){
console.log(trs[i][0])
var tds = [...trs[i][0].matchAll(/<(td|th)[\s\S\w]+?<\/(td|th)>/g)];
var prov = [];
for (var j=0;j<tds.length;j++){
donnee=tds[j][0].match(/(?<=\>).*(?=\<\/)/g)[0];
prov.push(stripTags(donnee));
}
data.push(prov);
}
return(data)
}
function stripTags(body) {
var regex = /(<([^>]+)>)/ig;
return body.replace(regex,"").replace(/ /g,' ').trim();
}
我使用以下公式大约一年了,突然它停止了 working/importing table。
=IMPORTHTML("https://tradingeconomics.com/matrix";"table";1)
它给了我一个 “无法获取 url: https://tradingeconomics.com/matrix" 错误。
我尝试了各种方法,其中一个有趣的发现是 importHTML 适用于缓存版本,但仅适用于不同 Google 帐户下的新 sheet。此外,缓存版本也会随机中断。
因此,我似乎不会为了这个目的而使用脚本。
理想情况下,这个脚本应该足够灵活,它应该有一个专门的功能,例如importHTMLtable 用户可以在其中输入 URL 和 table 号。它有效。所以它适用于我目前使用的以下功能,例如
=importHTMLtable("https://tradingeconomics.com/matrix";"table";1)
或
=importHTMLtable("https://tradingeconomics.com/country-list/business-confidence?continent=world";"table";1)
或
=importHTMLtable("https://tradingeconomics.com/country-list/ease-of-doing-business";"table";1)
等...
不确定 this Github 代码是否解决了这个问题。好像只能解析文本?
我认为这是 Google 表格用户的一个相当普遍的问题,并且认为可能已经有一个 AppScript 可以做到这一点,并且在导入速度方面也可能更快。
我不会编程,所以我尝试复制和发布代码,看看是否可以让一些代码工作。运气不好:(
任何人都可以提供代码或现有的应用程序脚本(我不知道)完全可以做到这一点吗?
试试这个方法
=importTableHTML(A1,1)
和
function importTableHTML(url,n){
var html = UrlFetchApp.fetch(url,{followRedirects : true,muteHttpExceptions: true}).getContentText().replace(/(\r\n|\n|\r|\t| )/gm,"")
const tables = [...html.matchAll(/<table[\s\S\w]+?<\/table>/g)];
var trs = [...tables[n-1][0].matchAll(/<tr[\s\S\w]+?<\/tr>/g)];
var data = [];
for (var i=0;i<trs.length;i++){
console.log(trs[i][0])
var tds = [...trs[i][0].matchAll(/<(td|th)[\s\S\w]+?<\/(td|th)>/g)];
var prov = [];
for (var j=0;j<tds.length;j++){
donnee=tds[j][0].match(/(?<=\>).*(?=\<\/)/g)[0];
prov.push(stripTags(donnee));
}
data.push(prov);
}
return(data)
}
function stripTags(body) {
var regex = /(<([^>]+)>)/ig;
return body.replace(regex,"").replace(/ /g,' ').trim();
}