尝试使用大型数据集

时间:2015-06-10 14:23:26

标签: google-apps-script google-sheets

我在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)"))

因此,对于单元格中函数中的每个参数,我必须导入数据列并对其进行子集化。

我确信必须有更好的方法。现在这确实有效,但速度非常慢。

我正在考虑的途径:

  1. SO上有人提到使用缓存服务here。但是如何工作或如何将它与上面的IMPORTRANGE()函数集成?
  2. 拥有csv文件有什么好处,还是我应该从一开始就将结果输出到GSheet中?
  3. 在脚本中我运行以获取数据,然后将其输出到csv文件(或Gsheet,如果那更好?)我在转换成文件之前将数据作为数组。我能在这里做些什么,比如直接从工作表中查询这个数组?请记住,我的脚本编写技巧非常基础。
  4. 据推测,我可以创建一个函数来为函数所在的每个单元格单独调用GA api,将结果返回到每个单独的单元格中(因此在上面的示例中,调用ga api的函数为year / year (G17)及一个月=月(G17)及介质= [some_other_cell_reference)。因此,此选项将导致更多api调用,但会导致更小的数据。不确定这是一个好主意还是完全走错方向。
  5. 我希望我已经充分地传达了我的问题。我需要找到一种更有效的方法来查询仪表板中的外部数据。

2 个答案:

答案 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>&nbsp;|&nbsp;'+ 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