【问题标题】:Formula To Aggregate Totals for Year汇总年度总计的公式
【发布时间】:2021-02-03 16:24:02
【问题描述】:

我有一个用于跟踪攀登进度的电子表格(如下所示的 sn-p)。我有公式和图表来跟踪特定等级的计数随着时间的推移,但我无法使用公式来保持(按年)的总爬升次数。我打算把它放在另一张纸上。

基本上,如果 Sheet1!A:A 以“21”开头,我想要一个执行类似...的单元格。如果 Sheet1!E:E,"*%" (这意味着我实际上完成了攀登),则将行总攀登长度 (Sheet1!J:J * Sheet1!I:I) 添加到该年的运行总数中.

最好的方法是什么?

【问题讨论】:

  • 如果 A 列是真实日期,则使用数据透视表。
  • @ScottCraner 我会摇一摇的。我在 Google 表格中,但我能够组合一个数据透视表,我只需要更聪明地了解如何使用它。
  • 如果 Google-Sheets 为什么使用 Excel 标签?适当地标记它,知道 Google-Sheets 的人可能会找到不同或更好的路线。
  • 分享您的工作表副本
  • 所以基本上你想添加这个特定年份的所有攀登?你也有过去一年的日期吗?如果没有,为什么不直接使用IFSUM 添加它们? @ShaneK

标签: google-sheets


【解决方案1】:

您可以尝试使用 Apps 脚本并创建一个脚本来管理您的任务。

例如,您可能想看看下面的 sn-p:

代码

function calculateTotal() {
  let ss = SpreadsheetApp.getActive().getSheetByName('Sheet1');
  let date = ss.getRange('A2:A').getDisplayValues();
  let tries = ss.getRange('E2:E').getDisplayValues();
  let lengths = ss.getRange('I2:I').getDisplayValues();
  let total = 0;
  for (let i =0; i<date.length; i++) {
    if (date[i][0].toString().startsWith('21') != false && tries[i][0].toString().includes('%') == false) {
       total = total+lengths[i][0];
    }
  }
  ss.getRange('M2').setValue(total);
}

说明

上面的脚本收集来自Sheet1 的所有值并循环遍历它们。如果条件检查(日期应以21 开头且E 列不包含%)则将相应的长度添加到总数中;在这种情况下,总数将保存在M2 单元格中。

进一步改进

使用脚本的优点是用途广泛且易于管理。在这种情况下,您可以利用 Apps Script 的时间驱动触发器;因此,假设您计划每天在特定时间更新电子表格,您可以创建一个触发器,该触发器将在它之后运行。

例如,下面的函数为上面的函数创建了一个触发器,它将每天在 ~9 点运行。

function createTrigger() {
    ScriptApp.newTrigger("calculateTotal")
        .timeBased()
        .atHour(9)
        .everyDays(1)
        .create();
}

参考

【讨论】:

  • 非常非常有帮助,感谢您的意见。如果可能,我正在设置一个触发器,以便在修改电子表格时运行。
  • 关于如何在同一脚本中获取唯一日期并转储每一天的总数有什么想法吗?
【解决方案2】:

感谢 Ale13 ...使用您的示例并添加一些东西(也需要 parseInt 总计)...

function calculateTotal() {
  
  let ss = SpreadsheetApp.getActive().getSheetByName('Sheet1');
  let s7 = SpreadsheetApp.getActive().getSheetByName('Sheet7');
  let date = ss.getRange('A2:A').getDisplayValues();
  let type = ss.getRange('F2:F').getDisplayValues();
  let tries = ss.getRange('E2:E').getDisplayValues();
  let lengths = ss.getRange('I2:I').getDisplayValues();
  let laps = ss.getRange('J2:J').getDisplayValues();
  
  let btotal = 0;
  let rtotal = 0;
  
  for (let i =0; i<date.length; i++) {
    if (date[i][0].toString().startsWith('21') != false && tries[i][0].toString().includes('%') == false) {
       // Totals for Bouldering 
       if (type[i][0] == "B") {
         btotal = btotal + parseInt(lengths[i][0]*laps[i][0]);
       }
       // Totals for Top Rope or Sport
       else {
         rtotal = rtotal + parseInt(lengths[i][0]*laps[i][0])
       }
    }
  }
  
  console.log("Roped total = " + rtotal)
  console.log("Bouldering total = " + btotal)

  s7.getRange('B2').setValue(rtotal);
  s7.getRange('B3').setValue(btotal);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多