Как исправить ссылку на столбец в многомерном массиве для пользовательской функции SUMIF? - PullRequest
0 голосов
/ 27 декабря 2018

Я создал пользовательскую функцию в 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 иacityColIdx = 4. Ранее они ссылались на 5-й и 4-й столбцы в моем диапазоне данных, и я предположил, что это будет то же самое смассив, упорядоченный по столбцам, но я не уверен.

...