【问题标题】:Sum if Across Multiple Sheets in Google Sheets如果跨 Google 表格中的多个表格求和
【发布时间】:2021-08-27 12:13:29
【问题描述】:

我需要计算每行不同工作表上 1 列的总和。 这是我的示例文件 - https://docs.google.com/spreadsheets/d/11KWjso_sLdHI-NWBk0Rtp-EnGfMyU6a3G143C1Tl6lE/edit?usp=sharing Sheet1 上的 С 列应计算所有页面上 T 列的总和。我正在尝试使用以下公式,但它不起作用: =SUMPRODUCT(SUMIFS(INDIRECT("'"&TO_TEXT(Rules!$D$1:$1)&"'!"&"T:T"),INDIRECT("'"&TO_TEXT(Rules!$D$1:$1)&" '!"&"A:A"),A2,INDIRECT("'"&TO_TEXT(Rules!$D$1:$1)&"'!"&"B:B"),B2)) 它仅计算第一页的总和。请帮忙。

【问题讨论】:

  • 不幸的是,INDIRECT 不支持对 google-sheets 中的数组进行迭代。 onEdit() 可能会为您提供 Rules 表的帮助。当您更改1:1 行中的数据时 - 脚本将更新Sheet1C 列中的公式

标签: google-sheets google-sheets-formula


【解决方案1】:

此代码将帮助您

function onEdit(e) {
  let source = e.source,
      range  = e.range,
      col    = range.columnStart,
      row    = range.rowEnd,
      sheet  = range.getSheet();
  if (sheet.getName() == 'Rules' && row == 1 && col>2){
    let sheetNames = sheet.getRange('1:1').getDisplayValues()[0].filter(String).slice(3),
        formula = sheetNames.reduce((r,element)=>{
          return r += `SUMIF('` + element + `'!A:A&'` + element + `'!B:B,A2:A&B2:B,'` + element + `'!T:T)+`
        },`={"SUM";ArrayFormula(if(A2:A<>"",`).replace(/\+$/,',))}');
    SpreadsheetApp.getActive().getSheetByName('Sheet1').getRange('C1').setFormula(formula)
  }
}

每次更改Rules1:1 行中的数据时,此脚本都会重写Sheet1 上单元格C1 中的公式

添加...

为了将公式更改为您想要的公式 ={"SUM";ArrayFormula( if(A2:A&lt;&gt;"",ifs((SUMIF('5/31/2021'!A:A&amp;'5/31/2021'!B:B,A2:A&amp;B2:B,'5/31/2021'!T:T)+SUMIF('6/16/2021'!A:A&amp;'6/16/2021'!B:B,A2:A&amp;B2:B,'6/16/2021'!T:T))=2,"New Full Time",SUMIF('5/31/2021'!A:A&amp;'5/31/2021'!B:B,A2:A&amp;B2:B,'5/31/2021'!T:T)+SUMIF('6/16/2021'!A:A&amp;'6/16/2021'!B:B,A2:A&amp;B2:B,'6/16/2021'!T:T))&lt;2,"Part Time",(SUMIF('5/31/2021'!A:A&amp;'5/31/2021'!B:B,A2:A&amp;B2:B,'5/31/2021'!T:T)+SUMIF('6/16/2021'!A:A&amp;'6/16/2021'!B:B,A2:A&amp;B2:B,'6/16/2021'!T:T))&gt;2,"Full Time"),))}将部分代码改成这个

...
   subFormula = sheetNames.reduce((r,element)=>{
     return r += `SUMIF('` + element + `'!A:A&'` + element + `'!B:B,A2:A&B2:B,'` + element + `'!T:T)+`
     },`(`).replace(/\+$/,')'),
   formula = '={"SUM";ArrayFormula(if(A2:A<>"",ifs(' + 
                      subFormula + '=2,"New Full Time",' + subFormula + '<2,"Part Time",' + subFormula + '>2,"Full Time"),))}'
...

但我认为下一个公式会更容易并且工作得更快 ={"SUM";ArrayFormula( if(A2:A&lt;&gt;"",SWITCH((SUMIF('5/31/2021'!A:A&amp;'5/31/2021'!B:B,A2:A&amp;B2:B,'5/31/2021'!T:T)+SUMIF('6/16/2021'!A:A&amp;'6/16/2021'!B:B,A2:A&amp;B2:B,'6/16/2021'!T:T)),0,"Part Time",1,"Part Time",2,"New Full Time","Full Time"),))}将其插入代码中,更改如下

...
formula = sheetNames.reduce((r,element)=>{
  return r += `SUMIF('` + element + `'!A:A&'` + element + `'!B:B,A2:A&B2:B,'` + element + `'!T:T)+`
},`={"SUM";ArrayFormula(if(A2:A<>"",SWITCH((`).replace(/\+$/,'),0,"Part Time",1,"Part Time",2,"New Full Time","Full Time"),))}');
...

但更快的是一个常数公式,可以写在下一列D

={"-Header-";ArrayFormula(if(C2:C&lt;&gt;"",ifs(C2:C&lt;2,"Part Time",C2:C=2,"New Full Time",C2:C&gt;2,"Full Time"),))}

【讨论】:

  • 谢谢,我在公式中添加了额外的 IFS 条件(请参见下文)。你能帮我修改脚本吗?
  • {"SUM";ArrayFormula(ifs((if(A2:A"",SUMIF('5/31/2021'!A:A&'5/31/2021'!B :B,A2:A&B2:B,'5/31/2021'!T:T)+SUMIF('6/16/2021'!A:A&'6/16/2021'!B:B,A2:A&B2 :B,'6/16/2021'!T:T),))=2,"新全职",(if(A2:A"",SUMIF('5/31/2021'!A: A&'5/31/2021'!B:B,A2:A&B2:B,'5/31/2021'!T:T)+SUMIF('6/16/2021'!A:A&'6/16/ 2021'!B:B,A2:A&B2:B,'6/16/2021'!T:T),))"",SUMIF(' 5/31/2021'!A:A&'5/31/2021'!B:B,A2:A&B2:B,'5/31/2021'!T:T)+SUMIF('6/16/2021' !A:A&'6/16/2021'!B:B,A2:A&B2:B,'6/16/2021'!T:T),))>2,"全职"))}
  • @MaksymKatsovets 我在回复中做了更改
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多