Как разделить суммы массива с помощью разделителя с помощью Google App Script? - PullRequest
2 голосов
/ 28 марта 2020

Я получил массив из одного столбца из листа Google, например [[23],[25],[26],[89],[""],[45],[78],[62],[""],[123],[45],[68]] Как я могу разделить его на пустые значения [] и получить суммы для каждого подмассива, например (163/185/236) или более, длина массива может быть быть больше 1000, включая 20-50 пустых значений?

Я модифицировал скрипт из ответа. Но это не работает в моем случае. Я не понимаю, почему?

function getSums(){
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sh = ss.getSheetByName('TemplateTest');
    var r = sh.getRange(1, 1, sh.getLastRow());
    var arr = r.getValues(); //log: [[23],[25],[26],[89],[""],[45],[78],[62],[""],[123],[45],[68]]
    var sums = [];
    var sum = 0;
    // iterate through the array
    for (var i = 0; i < arr.length; i ++) {
         if (arr[i].length == 0 || i == arr.length - 1) {
             // empty array, push sum to array and reset
             sums.push(sum);
             sum = 0;
         } else {
        // array has values, sum them up and add to sum
             sum += arr[i].reduce((a, b) => a + b);
         }
    }
    Logger.log(sums) //log: [16345786212345]
}

Где я не прав и как это исправить?

DEMO:

function getSums(){
    //var ss = SpreadsheetApp.getActiveSpreadsheet();
    //var sh = ss.getSheetByName('TemplateTest');
    //var r = sh.getRange(1, 1, sh.getLastRow());
    var arr = [[23],[25],[26],[89],[""],[45],[78],[62],[""],[123],[45],[68]]
    //var arr = r.getValues();
    var sums = [];
    var sum = 0;
    // iterate through the array
    for (var i = 0; i < arr.length; i ++) {
         if (arr[i].length == 0 || i == arr.length - 1) {
             // empty array, push sum to array and reset
             sums.push(sum);
             sum = 0;
         } else {
        // array has values, sum them up and add to sum
             sum += arr[i].reduce((a, b) => a + b, 0);
         }
    }
    console.log(sums) //log: [16345786212345]
}
getSums();

Ответы [ 2 ]

3 голосов
/ 28 марта 2020

Вы можете взять сдвоенную l oop и добавлять значения до тех пор, пока не достигнете undefined в качестве значения, затем pu sh сумма в наборе результатов и сбросить sum.

. end pu sh конечная сумма в наборе результатов тоже.

var data = [[23.0], [25.0], [26.0], [89.0], [""], [45.0], [78.0], [62.0], [""], [123.0], [45.0], [68.0]],
    result = [],
    sum = 0,
    value,
    i;

for (i = 0; i < data.length; i++) {
    value = data[i][0];
    if (value === "") {
        result.push(sum);
        sum = 0;
        continue;
    }
    sum += value;
}
result.push(sum);

console.log(result);
1 голос
/ 28 марта 2020

Используя array.reduce, это можно сделать очень легко.

const data = [
  [23.0],
  [25.0],
  [26.0],
  [89.0],
  [],
  [45.0],
  [78.0],
  [62.0],
  [],
  [123.0],
  [45.0],
  [68.0]
];
let [result, sum] = data.reduce(
  ([arr, sum], curr) => {
    if (curr.length) sum += curr[0];
    else arr.push(sum);
    return [arr, sum];
  },
  [[], 0]
);
result.push(sum); //push last data
console.log(result);
console.log(result.join("."));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...