如何为自定义SUMIF函数修复多维数组中的列引用?

时间:2018-12-27 14:19:41

标签: javascript multidimensional-array google-apps-script google-sheets

我在GAS中创建了一个自定义函数,该函数等效于SUMIF公式,并将通过一个数组来运行,该数组包含Google表格中的一系列数据。当“状态”列与图纸中定义范围内的条目匹配时,该功能将对“容量”列进行求和。

它工作得很好,直到我重新排列数组以按列而不是按行分隔为止。排列的列为:项目名称,连接类型,所有权,国家/地区,容量状态,技术,燃料,调试日期,调试结束日期。这是数组现在的外观,按列排序。

[[Azambi Hydro, Budana Hydro, Busanga Hydro, Dilolo Thermal, N'zilo I Hydro], [Embedded, Embedded, Embedded, Embedded, Embedded], [IPP, IPP, IPP, IPP, PPP], [DR Congo, DR Congo, DR Congo, DR Congo, DR Congo], [10.0, 11.0, 240.0, 0.0, 108.0], [Construction, Operating, Planned, Operating, Rehabilitation], [Conventional hydro, Conventional hydro, Conventional hydro, Undecided or unknown, Conventional hydro], [Hydro, Hydro, Hydro, Cogeneration, Hydro], [Sat Dec 01 08:00:00 GMT+00:00 2018, Mon Jan 01 08:00:00 GMT+00:00 1940, Fri Dec 31 08:00:00 GMT+00:00 2021, , Thu Jan 01 08:00:00 GMT+00:00 1953], [, , , , ]]

由于某种原因,该函数无法与以这种方式排列的数组一起使用,而且我似乎无法弄清原因。

完整代码:

var sheet = SpreadsheetApp.getActiveSpreadsheet()
var statusColumn = sheet.getSheetByName('Supply Projections').getRange(6,7,9,1).getValues()

var status = statusColumn.map(function (x) { return x[0] });
var status0 = status[0];
var status1 = status[1];
var status2 = status[2];
var status3 = status[3];
var status4 = status[4];
var status5 = status[5];
var status6 = status[6];
var status7 = status[7];
var status8 = status[8];
var statusArray = [status0,status1,status2,status3,status4,status5,status6,status7,status8];


function transpose(data) {

return (data[0] || []).map (function (col , colIndex) {
return data.map (function (row) {
  return row[colIndex];
  });
});
 }


var sheetData = transpose(sheet.getSheetByName('Project 
Selector').getRange('$D$3:M7').getValues())

//SUMIF function
function sumIf(sumColIdx, criteriaColIdx, criteria, data) {
  return data
    .filter(function (row) {
      return row[criteriaColIdx] === criteria
    })
    .reduce(function (acc, row) {
      return acc + row[sumColIdx]
    }, 0)
}

  var capacityStatusSums = statusArray.map(function (criteria) {
    var statusColIdx = 5
    var capacityColIdx = 4
    return sumIf(capacityColIdx, statusColIdx, criteria, sheetData)
  })

我认为这可能是我在数组中引用位置的方式,请参见statusColIdx = 5和CapacityColIdx =4。以前,他们引用了我数据范围内的第5列和第4列,并且我认为与按列排列的数组,但我不确定。

0 个答案:

没有答案