自动将XML数据收集到电子表格
我正在尝试设置一个XML解析器,该解析器每小时自动收集数据并将其附加到电子表格的底部。我收集的数据每小时更新一次,我希望尽可能保持最新 我从中绘制的XML如下所示: 格式如下:自动将XML数据收集到电子表格,xml,google-apps-script,Xml,Google Apps Script,我正在尝试设置一个XML解析器,该解析器每小时自动收集数据并将其附加到电子表格的底部。我收集的数据每小时更新一次,我希望尽可能保持最新 我从中绘制的XML如下所示: 格式如下: <?xml version='1.0' encoding='UTF-8'?> <eveapi version="1"> <currentTime>2007-12-12 11:50:38</currentTime> <result> <row
<?xml version='1.0' encoding='UTF-8'?>
<eveapi version="1">
<currentTime>2007-12-12 11:50:38</currentTime>
<result>
<rowset name="solarSystems" key="solarSystemID" columns="solarSystemID,shipJumps">
<row solarSystemID="30001984" shipJumps="10" />
</rowset>
<dataTime>2007-12-12 11:50:38</dataTime>
</result>
<cachedUntil>2007-12-12 12:50:38</cachedUntil>
</eveapi>
当我手动运行它时,它工作得很好,但它是自动部分,会出现故障。我尝试设置一个每小时时间驱动的触发器来运行脚本,但在自动脚本中,我一次又一次地遇到相同的错误:“范围的坐标或维度无效。(第13行,文件“代码”)”
我还认识到,即使我能让它发挥作用,我一次也只能收集约10个小时的数据块(谢谢400000个单元格限制…)
因此,我希望得到以下方面的任何建议:
这种方法很有趣,但我认为如果将导入公式与触发的Google Apps脚本函数结合使用,您总会遇到问题,因为公式计算和脚本执行会出现延迟 正如GoogleApps脚本所拥有的,它可以很好地处理格式良好的Xml,相反,使用它是一种更好的方法。对于特定的Xml文档,您可以使用:
function EVEJumpsCollection() {
var output = [];
// modified from https://developers.google.com/apps-script/reference/xml-service/
var url = 'https://api.eveonline.com/map/Jumps.xml.aspx'; // where
var xml = UrlFetchApp.fetch(url).getContentText(); // fetch
var document = XmlService.parse(xml); // parse
// next nav to part of tree and get values
var cachedUntil = document.getRootElement().getChild("cachedUntil").getValue();
var currentTime = document.getRootElement().getChild("currentTime").getValue();
// get rowset elements and iterate accross
var rowset = document.getRootElement().getChild("result").getChild("rowset").getChildren();
for (var i = 0; i < rowset.length; i++) {
// extracting attribute values (note case sensitive)
var solarSystemID = rowset[i].getAttribute("solarSystemID").getValue();
var shipJumps = rowset[i].getAttribute("shipJumps").getValue();
// more effiecient to build object[][] of values and do one write
output.push([solarSystemID, shipJumps, cachedUntil, currentTime]);
}
// where we want it to go
var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheet/ccc?key=0AgjR0Xz9d5o_dFc1RDdsYmZtNFo5eEp3a1FYZ2piT3c&usp=sharing");
var sheet = ss.getSheets()[0];
sheet.getRange(sheet.getLastRow()+1, 1, output.length, 4).setValues(output);
}
函数EVEJumpsCollection(){
var输出=[];
//修改自https://developers.google.com/apps-script/reference/xml-service/
var url='1〕https://api.eveonline.com/map/Jumps.xml.aspx“;//在哪里
var xml=UrlFetchApp.fetch(url).getContentText();//fetch
var document=XmlService.parse(xml);//parse
//下一个导航到树的一部分并获取值
var cachedUntil=document.getRootElement().getChild(“cachedUntil”).getValue();
var currentTime=document.getRootElement().getChild(“currentTime”).getValue();
//获取行集元素并迭代accross
var rowset=document.getRootElement().getChild(“结果”).getChild(“行集”).getChildren();
对于(变量i=0;i
在谷歌表单填充方面,有两种选择。您可以在每次运行它或为它向Google Drive写入.CSV文件时使用它。还值得注意的是,Stackoverflow上类似的应用程序脚本/XML使用了旧的XML服务,该服务已被弃用 太棒了,非常感谢!事实上,我找到了一个拼凑而成的解决方法,但是我回来理解了你的方法。我开始掌握它的窍门了,而且更喜欢它!不过,使用这段代码仍然有一些令人困惑的地方,我能否以某种方式向您提问?@Calvin_xc1确定您可以在此处发表评论(这可能会帮助其他人)或通过我的个人资料与我联系links@mhawksey你能帮我吗?我想每小时使用importxml公式自动提取谷歌搜索结果,并将数据附加到电子表格的底部。你能告诉我怎么做吗?=IMPORTXML(“google.com/search?q=Bmw&num=10”;“//h3[@class='r']”)
function EVEJumpsCollection() {
var output = [];
// modified from https://developers.google.com/apps-script/reference/xml-service/
var url = 'https://api.eveonline.com/map/Jumps.xml.aspx'; // where
var xml = UrlFetchApp.fetch(url).getContentText(); // fetch
var document = XmlService.parse(xml); // parse
// next nav to part of tree and get values
var cachedUntil = document.getRootElement().getChild("cachedUntil").getValue();
var currentTime = document.getRootElement().getChild("currentTime").getValue();
// get rowset elements and iterate accross
var rowset = document.getRootElement().getChild("result").getChild("rowset").getChildren();
for (var i = 0; i < rowset.length; i++) {
// extracting attribute values (note case sensitive)
var solarSystemID = rowset[i].getAttribute("solarSystemID").getValue();
var shipJumps = rowset[i].getAttribute("shipJumps").getValue();
// more effiecient to build object[][] of values and do one write
output.push([solarSystemID, shipJumps, cachedUntil, currentTime]);
}
// where we want it to go
var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheet/ccc?key=0AgjR0Xz9d5o_dFc1RDdsYmZtNFo5eEp3a1FYZ2piT3c&usp=sharing");
var sheet = ss.getSheets()[0];
sheet.getRange(sheet.getLastRow()+1, 1, output.length, 4).setValues(output);
}