Как получить сумму массива по столбцу в Google Sheets - PullRequest
0 голосов
/ 01 апреля 2020

Это мой первый вопрос, поэтому прошу прощения за любые ошибки при публикации.

Я использовал эту настройку: Создание скрипта Google App для объединения одинаковых строк в одну строку

для объединения данных с аналогичной записью строки по столбцу 1 и полученной комбинации в массиве

На рисунке показаны только ячейки, в которых сформировался массив

The image just shows the cells where the array has formed

Хотя это было отличное начало для меня, я бы предпочел иметь эти цифры в массиве будут добавлены вместе в одно значение, такое как изображение ниже:

Это изображение является новой версией первой фотографии, где данные массива суммируются

This image is a new version of the first photo where the array data is summed

Письменный пример: от [14,15] до [29]

Ниже я приведу сценарий, который использовал, благодаря пользователю по имени Cooper

Большое спасибо заранее!

function rowMerge() {
  var firstRow = 2;
  var firstCol = 1;
  var sht = SpreadsheetApp.getActiveSheet();
  sht.getRange(firstRow, firstCol, sht.getLastRow() - firstRow + 1, sht.getLastColumn() - firstCol + 1).sort(1);
  sht.appendRow(['***','***','Control-z one more time','***','***']); //need a throwaway row to get last data element out since I'm moving out element[i-1]
  var datR = sht.getDataRange();
  var lastRow = datR.getLastRow();
  var lastCol = datR.getLastColumn();
  var datA = datR.getValues();
  sht.getRange(2,1,lastRow - firstRow + 1,lastCol - firstCol + 1).clearContent().setWrap(true);
  var datoutA = [];
  var k=1;
  var n = 0;
  for(var i = 0;i < datA.length; i++)
  {
    if(i > 1)
    {
      if(datA[i][0] == datA[i-1][0])
      {
        k++;  //k is the number of consecutive matching values
      }
      else
      {
        datoutA[n] = [];
        if(k == 1)
        {
          // if k = 1 the datA[i-1] row gets copied into output array
          for(var c = 0;c < datA[i-1].length; c++)
          {
            datoutA[n][c]=datA[i-1][c];
          }
        }
        else
        {
          //i-1 to i-k rows get merged and copied into output array
          var firstTime = true;
          for(var a = 1;a <= k;a++)//input rows
          {            
            for(var b = 0;b < datA[i].length -1;b++)//input columns
            {
                if(a > 1 || b > 0) //no delimiter for first row or first column 
                {
                  datoutA[n][b] += ', ';
                }
               if(firstTime || b == 0)// straight assignment for first row and running sum after that same with first column because we only want one of them because they're all the same.
               {
                 datoutA[n][b] = datA[i - a][b];
               }
               else
               {
                 datoutA[n][b] += datA[i - a][b];
               }
            }
            if(firstTime)//first assignment then running sums for last column
            {
              datoutA[n][datA[i].length - 1] = Number(datA[i - a][datA[i].length-1]);
            }
            else
            {
              datoutA[n][datA[i].length - 1] += Number(datA[i - a][datA[i].length-1]);
            }

            firstTime=false;
          }
          var end = 'is near';
        }
        k=1; //consecutive counter
        n++; //datoutA index
      }

    }

  } 
  var datoutR = sht.getRange(2, 1, datoutA.length , datoutA[0].length);
  datoutR.setValues(datoutA);
  var colwidth = 250;
  sht.setColumnWidth(2, colwidth);
  sht.setColumnWidth(3, colwidth);
  sht.setColumnWidth(4, colwidth);
}

1 Ответ

0 голосов
/ 02 апреля 2020

Вы можете достичь этого с помощью этой простой функции. Идея состоит в том, чтобы проанализировать ячейку, содержащую числа, и уменьшить ее значение до их суммы. Я буду использовать два цикла for, чтобы отслеживать индексы строк и столбцов и выполнять замену на месте.

function reduceRowsValues() {
  let rows = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); //Gets rows containing values
  for (let i=0; i<rows.length; i++) {
    for (let j=0; j<rows[i].length; j++) {
      if (rows[i][j] != "") {
        let reducedValue = rows[i][j].toString().split(",").reduce((a,b)=> a + parseInt(b), 0); //assuming you will use integers
        SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(i+1, j+1).setValue(reducedValue);
      }
    }
  }
}

Не стесняйтесь изменять функцию parseInt на любую функцию, которая лучше подходит для вашего тип данных. Вы также можете изменить разделитель "," в функции split, если будете использовать другой символ для представления своих списков.

Ссылки:

setValue

JS уменьшить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...