Google sheets 如何从GoogleSheets构建自定义报告

Google sheets 如何从GoogleSheets构建自定义报告,google-sheets,google-data-studio,Google Sheets,Google Data Studio,我在谷歌上找到了一种从数据电子表格生成报告的方法,而谷歌数据工作室和谷歌表格似乎是实现这一目标的一种选择 尽管我在LibreOffice Calc方面有一些经验,但我在Google Sheets和DataStudio方面还是新手 我在Google Sheets中的数据是: 我想要构建的报告,当新数据到达谷歌表单时(比如说,每天左右),它必须更新 我只是给字段名上色(objId;objDesc;objMore;objProgress;taskId;taskDesc;taskMore;event

我在谷歌上找到了一种从数据电子表格生成报告的方法,而谷歌数据工作室和谷歌表格似乎是实现这一目标的一种选择

尽管我在LibreOffice Calc方面有一些经验,但我在Google Sheets和DataStudio方面还是新手

我在Google Sheets中的数据是:

我想要构建的报告,当新数据到达谷歌表单时(比如说,每天左右),它必须更新

我只是给字段名上色(objId;objDesc;objMore;objProgress;taskId;taskDesc;taskMore;event)并将数据排序到电子表格中,以便于理解我想要实现的目标

感谢您的帮助。

解决方案 因此,基本上,只要单击一个按钮,您就需要按照所描述的顺序生成对象、任务和事件的层次结构的报告

在这个解决方案中,我提供了最复杂部分所需的代码,然后是其余步骤的指导

  • 在工作表中添加一个按钮,其中包含插入->绘图中的数据,然后绘制按钮
  • 创建新的工作表并插入以下公式,如图所示:
  • 这些forumulas基本上将检测指定列(在我们的示例中是对象ID和任务ID的列)中的值的任何更改,这将有助于生成报告

  • 在此之后,浏览脚本编辑器,并使用以下函数生成一个对象数组,该数组具有按层次顺序排列的正确数据。下面的代码包含自解释的注释。这是最棘手的部分,它使用先前创建的工作表来了解对象和任务Id在哪里更改,并将正确的信息存储在正确的位置
  • 对于此数据:

    这将是运行函数后生成的对象:

     [{ObjectId=1.0, 1={TaskId=S02, Events=[[3242.0]], TaskMore=ppp, Description=ppp}, 0={TaskId=S01, Description=qqq, Events=[[1.0], [23.0], [324.0]], TaskMore=qqq}, ObjectMore=aaaa, ObjectDesc=aaaa, 2={TaskMore=lll, Events=[[3.0]], TaskId=S03, Description=lll}, ObjectProgress=0.7}, {3={Description=www, Events=[[43.0]], TaskMore=www, TaskId=T01}, 5={TaskId=T03, Events=[[5.0]], TaskMore=ttt, Description=ttt}, ObjectMore=bbbb, 4={Description=eee, TaskId=T02, TaskMore=eee, Events=[[54.0], [4.0]]}, ObjectDesc=bbbb, 6={Description=yyy, Events=[[345.0], [343.0]], TaskId=T04, TaskMore=yyy}, ObjectProgress=0.33, ObjectId=2.0}]
    
    函数myFunction(){
    //拿床单
    var sheetData=SpreadsheetApp.getActive().getSheetByName('Sheet1');
    var sheetHelp=SpreadsheetApp.getActive().getSheetByName('Sheet2');
    //这是我们存储信息的阵列
    变量对象=[]
    //从帮助表中获取检测该列中的更改的值范围
    var ObjectIds=sheetHelp.getRange(2,1,sheetHelp.getLastRow(),1).getValues().flat();
    var TaskIds=sheetHelp.getRange(2,2,sheetHelp.getLastRow(),2).getValues().flat();
    //删除FLAT数组中的所有空白元素
    ObjectIds=ObjectIds.filter(item=>item);
    TaskIds=TaskIds.filter(item=>item);
    //删除最后一项,因为这只是值和空白单元格之间的更改
    ObjectIds.pop();
    TaskIds.pop();
    //让我们遍历检测到的所有主要对象
    
    对于(i=0;ii如果您将其视为关系表,您会发现有三个表及其字段:Object objId;objDesc;objMore;objProgress.Task taskId;taskDesc;taskMore.Event objId;taskId;Event.Hi!您只想使用DataStudio还是只想使用DataStudio创建报告?因为您可以使用电子表格和应用程序脚本创建报表,而无需Data Studio。您是否愿意使用其中任何一种解决方案?此外,您希望在每次收到新数据时创建报表,对吗?您希望这些报表以PDF格式下载还是通过Gmail发送?您好,Mateo,是的,我愿意使用解决方案使用谷歌电子表格和应用程序脚本。是的,每次电子表格中包含新行时,报告都会更新,或者我单击按钮更新报告。我期待您的指导。感谢您的回复。嗨,Mateo,非常有趣的解决方案。我将尽快阅读、运行和反馈。谢谢您的帮助。嗨,Mateo,我收到了卡在你解释的第5步。我想知道第5步的第二个选项,我的意思是:“生成一个新的工作表,并用图片中显示的结构粘贴此数据…”我已经尝试过(var sheetReport=SpreadsheetApp.getActive().getSheetByName('my_new_sheet_name');)在应用程序脚本,但我迷路了…嗨,我相应地编辑了我的答案,以指导您如何使用这些数据以正确的顺序打印在新的表格中。希望这有帮助:DHi Mateo,它确实有很大帮助。谢谢。
    =iferror(ArrayFormula(lookup(unique(Sheet1!E2:E),Sheet1!E2:E,row(Sheet1!E2:E)+1)))
    
     [{ObjectId=1.0, 1={TaskId=S02, Events=[[3242.0]], TaskMore=ppp, Description=ppp}, 0={TaskId=S01, Description=qqq, Events=[[1.0], [23.0], [324.0]], TaskMore=qqq}, ObjectMore=aaaa, ObjectDesc=aaaa, 2={TaskMore=lll, Events=[[3.0]], TaskId=S03, Description=lll}, ObjectProgress=0.7}, {3={Description=www, Events=[[43.0]], TaskMore=www, TaskId=T01}, 5={TaskId=T03, Events=[[5.0]], TaskMore=ttt, Description=ttt}, ObjectMore=bbbb, 4={Description=eee, TaskId=T02, TaskMore=eee, Events=[[54.0], [4.0]]}, ObjectDesc=bbbb, 6={Description=yyy, Events=[[345.0], [343.0]], TaskId=T04, TaskMore=yyy}, ObjectProgress=0.33, ObjectId=2.0}]