【问题标题】:Sum cells from a selection of sheets in a Google Sheets Workbook对 Google 表格工作簿中所选工作表中的单元格求和
【发布时间】:2020-01-17 22:40:05
【问题描述】:

我创建了一个用于跟踪商店间项目转移的工作簿。每个月的每一天都有页面。我想制作一个总计页面以在单独的表格上统计总转移。 (我不想将工作簿中的其他页面添加到总数中。)

我正在尝试编写一个脚本,该脚本将获取表格 1 到 31 上单元格 A1 的值,并将总和放在单元格 A1 中的表格 32 上,其他所有单元格也是如此。

现在我正在使用一个名为“自定义计数和总和”的谷歌表格插件,它让我可以像我想要的那样将所有页面加在一起,但是页面名称作为字符串传递,所以你不能复制和粘贴公式细胞。我通过使用 address(row(),column(),4,true) 来引用单元格位置找到了一种解决方法,因此我不必手动输入每个单元格。现在我正在尝试使其值无需我重新输入公式即可更新。我无法使用我安装的附加功能执行此操作,因为据我所知,我需要传递另一个参数,但我无法在附加公式中执行此操作。我正在尝试编写自己的脚本,并尝试使用以下问题中的信息,但没有成功。

Google Sheets Sum values from ALL sheets in a workbook

任何帮助将不胜感激

【问题讨论】:

  • 你能分享你的工作表吗?你的表只有数字吗?您是否愿意接受 Apps 脚本解决方案
  • docs.google.com/spreadsheets/d/… 我愿意使用脚本,我已经在工作簿中编写了一些脚本。我提前为我的业余脚本技能道歉。
  • 你要加起来的数据是哪一项?有很多不是数字的单元格(空白或字符)。也许是您想要的示例(或屏幕截图)?
  • 客户将值输入到与商品及其商店关联的单元格中。因此,像 D7:I18 这样的范围会为当天订单输入值。我在发送给您的示例工作簿的表 1 上输入了一些示例数字。我想汇总与商店和商品关联的所有单元格。如果我将来需要从指南中添加或删除项目,我正在寻找一个灵活的脚本。
  • 我仍然不确定您想要获得总和的范围是多少?是D7:I18的范围吗?你说你想要一个灵活的脚本,你有什么约束可以确定总和的范围?你的改变将如何增长/改变?

标签: function google-apps-script google-sheets


【解决方案1】:

让我们看看这个解决方法是否适合您。

在这种情况下,如果您想要一个函数来获取所有单元格并求和,您应该尝试匹配要从中获取值的工作表。在您的情况下,您可以查找所有 数字 的值。

/**
 * Sum all the values in the cells/range of all the sheets that match the
 * regular expressión `(\d)+`
 *
 * @param {string} A1Notation - Range in A1Notation that would be sum for all the cells  
 */
function SUM_SHEETS(A1Notation){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();

  var regEx = /\b\d+\b/; // The regEx that will match the sheets

  var result = 0;
  for(var i=0; i < sheets.length; i++){
    var sheet = sheets[i];

    // Check that your sheet is matching your regular Expression
    if( regEx.test(sheet.getName())){

      var range = sheet.getRange(A1Notation);
      var values = range.getValues();

      // Iterate through all the range from all the current sheet
      for(var j=0; j < values.length; j++){
        for(var k=0; k < values[j].length; k++){
          var value = values[j][k];

          // Only sum when the cell is a number
          if (typeof value == "number"){
            result += value;
          }
        }
      }
    }
  }

  return result;
}

考虑到输入参数是代表您的范围的字符串,因此您可以遍历工作表。

还要注意工作表,在此解决方法中,我使用了一个正则表达式,它将对所有数字值(仅数字)求和。

【讨论】:

  • 非常感谢。这似乎给了我想要的结果。我想我现在需要学习 regEx 是如何工作的。再次感谢。
  • 我不知道您是否注意到,但您可以根据需要对范围求和。这意味着你可以写A1:B4,而不是A1,这将把所有单元格中的所有数字相加。
【解决方案2】:

通常,最好在一个选项卡中收集每天、每月和所有年份的所有数据。每个项目在它自己的行上都有一个日期,就像一个数据库。

与将不同选项卡中的数据聚合到一个选项卡中相比,将完全位于一个选项卡上的数据分解到不同选项卡以进行汇总/计数/分析要容易得多。

【讨论】:

    【解决方案3】:

    当使用=SUM_SHEETS(A1Annotation) 时,我为完成这项工作所做的工作(对于我需要的 13 行)是在 A 列中输入 L1,L2,...,L13,这将引用我想用这个函数求和的工作表中的单元格 在公式列 (B) 中,我用单元格 A1 替换了 SUM_SHEETS()L1 部分(因为我刚刚在单元格 A13 中输入了 L1)。

    示例: | A栏    | B栏| |----------------------|----------| | L1 | =SUM_SHEETS(A13) | | L2 | =SUM_SHEETS(A14) |
    | ... | |
    | L13 | =SUM_SHEETS(A25) |

    而不是: | A栏| |--------------------| | =SUM_SHEETS("L1") |
    | =SUM_SHEETS("L2") | | ... | | =SUM_SHEETS("L13") |

    最后,为了在我想要的时候刷新,我创建了一个按钮和一个宏,从字面上删除单元格 A13:A25 中的数据,然后将它们放回原处。

    function Refresh_Summary() {
      var spreadsheet = SpreadsheetApp.getActive();
      spreadsheet.getRange('A13:A25').activate();
      spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
      spreadsheet.getRange('A13').activate();
      spreadsheet.getCurrentCell().setValue('L1');
      spreadsheet.getRange('A14').activate();
      spreadsheet.getCurrentCell().setValue('L2');
      spreadsheet.getRange('A15').activate();
      spreadsheet.getCurrentCell().setValue('L3');
      spreadsheet.getRange('A16').activate();
      spreadsheet.getCurrentCell().setValue('L4');
      spreadsheet.getRange('A17').activate();
      spreadsheet.getCurrentCell().setValue('L5');
      spreadsheet.getRange('A18').activate();
      spreadsheet.getCurrentCell().setValue('L6');
      spreadsheet.getRange('A19').activate();
      spreadsheet.getCurrentCell().setValue('L7');
      spreadsheet.getRange('A20').activate();
      spreadsheet.getCurrentCell().setValue('L8');
      spreadsheet.getRange('A21').activate();
      spreadsheet.getCurrentCell().setValue('L9');
      spreadsheet.getRange('A22').activate();
      spreadsheet.getCurrentCell().setValue('L10');
      spreadsheet.getRange('A23').activate();
      spreadsheet.getCurrentCell().setValue('L11');
      spreadsheet.getRange('A24').activate();
      spreadsheet.getCurrentCell().setValue('L12');
      spreadsheet.getRange('A25').activate();
      spreadsheet.getCurrentCell().setValue('L13');
    };

    (当SUM(First:Last!L1) 会更快但它有效时有点解决方法)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      相关资源
      最近更新 更多