我在Google云端硬盘中的“我的信息中心”表格中有一个自动信息中心。
信息中心的数据来自Google Analytics(GA),通过API。我使用Google表格GA增加了大部分数据。
我在仪表板中其中一个表的源数据非常大 - 太大而无法放入工作表本身。
所以,凭借一些有限的脚本技能以及本论坛和一些在线教程的帮助,我在Google-Apps-Script中创建了一个脚本,用于查询GA api并返回我需要的所有数据,然后将其放入csv文件与主仪表板位于同一目录中。
现在,在我的“仪表板”文件夹中,我有两个文件:“我的仪表板” - 一张工作表和“我的数据”一个csv文件。如果我愿意的话,我可以将api调用的结果输出到工作表我只是假设csv文件会更有效。
我在Gsheet中打开了“我的数据”csv文件并将其称为“合并”。以下是数据的示例:
ga:year ga:month ga:medium ga:source ga:campaign ga:goal1Completions
2013 5 (none) (direct) (not set) 116
2013 5 (not set) Adperio silvercontact?dp 0
2013 5 (not set) Conde*it _medium=email 0
2013 5 (not set) Hearst (not set) 0
2013 5 (not set) stackersocial stackersocial 0
2013 5 12111 9591 201fHN000xRGGszT3aEAA11uIsaT000. 0
2013 5 12111 9591 201fHN00BrT.K.AY0Hvf3q1uIqgl000. 0
2013 5 12111 9591 201fHN00CK619oBE3OsBZp1uIqGX000. 0
2013 5 12111 9591 201fHN00DFXJxnUu1jx25M1uIzkC000. 0
有大约65,000行数据。
现在,在我的仪表板中,我需要一个表,在“组合”表中对数据进行分组和聚合(或者我可以以某种方式使用csv?)。我喜欢的配方通常是例如。
=sum(filter(ga:goal1Completions, ga:year="2015"... ))
拉入并查询这些数据证明是困难的,我希望得到一些建议。
我无法简单地将数据导入我的仪表板,因为我收到超过最大200k格的纸张大小的警报。所以我必须依靠公式导入数据并每次运行计算。这是我刚刚使用的一个例子:
=SUM(filter(IMPORTRANGE("https://docs.google.com/spreadsheets/d/xxxxxxxx/edit?usp=sharing","combined!F2:F"),
IMPORTRANGE("https://docs.google.com/spreadsheets/d/xxxxxxxx/edit?usp=sharing","combined!A2:A")=year(G$17),
IMPORTRANGE("https://docs.google.com/spreadsheets/d/xxxxxxxx/edit?usp=sharing","combined!B2:B")=month(G$17),
IMPORTRANGE("https://docs.google.com/spreadsheets/d/xxxxxxxx/edit?usp=sharing","combined!C2:C")="(direct)",
IMPORTRANGE("https://docs.google.com/spreadsheets/d/xxxxxxxx/edit?usp=sharing","combined!D2:D")="(none)"))
因此,对于单元格中函数中的每个参数,我必须导入数据列并对其进行子集化。
我确信必须有更好的方法。现在这确实有效,但速度非常慢。
我正在考虑的途径:
我希望我已经充分地传达了我的问题。我需要找到一种更有效的方法来查询仪表板中的外部数据。
答案 0 :(得分:2)
不使用多个IMPORTRANGE和FILTER一次导入一列,而是使用一个IMPORTRANGE在一步中提取所需的所有列,并使用QUERY执行所需的操作。
与在FILTER中包含IMPORTRANGE的方式相同,您可以将其包含在QUERY中
即。为简单起见,我将只添加一个过滤条件
for(var x = 0; x<response.length; x++) {
//format date
var posted = new Date((response[x].posted * 1000));
//format extract line brakes
var extract = response[x].extract.replace(/(\r\n|\n|\r)/gm,"<br>");
//format categories
var categories = response[x].cat_name.split(",");
//append JSON to HTML
$("#articles-feed").append(
'<div class="article-box"><h1><a href="#">'+response[x].title+
'</a></h1><h3><a href="#">' +response[x].name+
'</a> | '+ posted.toLocaleDateString()+
'</h3><ul class="article-categories">');
for(x=0; x<categories.length;x++) {
$('#articles-feed').append(
'<li class="article-category">' + categories[x] + '</li>'
); //end categories append data
if (categories[x] == "free") {
$(".article-box").addClass("free");
}
}// end categories append for loop
$("#articles-feed").append(
'</ul><p>'+extract+'</p></div>'
); //end article feed 3rd append
} //end article feed for loop
答案 1 :(得分:2)
由于源表数据对于Google表格来说太大,您可以使用另一种数据存储来执行有趣的查询 - 例如Fusion Tables。
您可以通过FusionTables高级服务从Google Apps脚本访问Fusion Tables,该服务必须是enabled first。
在Database abstraction with google apps script中,Bruce McPherson引入了一个抽象层,可以将各种服务作为后端仓库。这将为您处理FusionTables的细节。更好的是,您可以重构代码,先将cDbAbstraction library与现有的Google Sheet后端一起使用,然后在以后为完整数据集添加DriverFusion。