Выполнение нескольких SUMIFS — Редактор сценариев Google Sheet

#javascript #google-apps-script

#javascript #google-приложения-скрипт

Вопрос:

Я пытаюсь выполнить SUMIFS в редакторе сценариев Google Sheet

То, что я пытаюсь сделать, это…

У меня есть эта необработанная таблица.

введите описание изображения здесь

Я пытаюсь создать отчет, который выглядит следующим образом .. с соответствующими значениями (из этой необработанной таблицы)

введите описание изображения здесь

введите описание изображения здесь

Итак, я использовал SUMIFS (значение) SUMIFS (значение) для этого.

Есть ли способ выполнить ту же работу в редакторе сценариев?

Комментарии:

1. Не могли бы вы поделиться с нами результатами ваших попыток?

2. Да, это можно сделать с помощью apps script.

3. Да, я обновлю вопрос с помощью рабочего процесса!

Ответ №1:

Я написал test функцию для чтения АКТИВНЫХ значений листа и записи отчетов разных поставщиков на отдельных листах. Если вы хотите узнать больше о моем коде, дайте мне знать в комментарии.

 function test() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.getActiveSheet();
  var values = sheet.getDataRange().getValues();
  // remove header row values from array
  values.shift();

  // will be months present in data
  // { JAN: 1, FEB: 1 ... }
  var mos = {};
  // data structure
  // { A: {JAN: [value1, value2] }... }
  var ds = {};
  values.forEach(function(row) {
    var month = row.shift(); // 1st col
    var ven = row.shift(); // 2nd col
    mos[month] = 1; // set month on mos
    ds[ven] = ds[ven] || {};
    // set value on ds
    // example = ds.A.JAN = [ A B, C D ]
    ds[ven][month] = [parseInt(row[0])   parseInt(row[1]), parseInt(row[2])   parseInt(row[3])];
  });
  //  Logger.log(mos);
  var months = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'];
  // filter months to get months present in sheet data in order
  months = months.filter(function(m) {
    return mos[m] == 1;
  });
  // Logger.log(months);
  // result object, for each vendor create array of rows
  // { A: [ row, row... ]... }
  var rs = {};
  Object.keys(ds).forEach(function(v) {
    rs[v] = rs[v] || [];
    months.forEach(function(m) {
      if (ds[v][m]) {
        rs[v].push([m, ds[v][m][0], ds[v][m][1]]);
      } else {
        rs[v].push([m, 'N/A', 'N/A']);
      }
    });
  });
  // Logger.log(rs);
  // write rows
  Object.keys(rs).forEach(function(v) {
    var headers = [['Vendor', v, 'Report'].join(' '), 'Conversion (A B)', 'Conversion (C D)'];
    // insert headers into rows for writing
    rs[v].unshift(headers);
    try {
      ss.insertSheet(headers[0]);
    } catch (e) {}
    var sh = ss.getSheetByName(headers[0]);
    sh.clear();
    sh.getRange(1, 1, rs[v].length, 3).setValues(rs[v]);
  });
}
  

Комментарии:

1. Это потрясающе! Это именно то, что я искал.. Хотя сейчас пытаюсь понять каждую строку. Я оставлю комментарий, если у меня возникнут вопросы..

2. о, для этого кода values.shift(), зачем это необходимо? сделано ли это, чтобы установить месяц и столбец поставщика равными 1,2 для каждого? не 0,1?

3. Я прочитал все строки в sheet, но строка 1 является строкой заголовка, поэтому shift () удаляет эту строку из значений, сохраняются только строки значений. Также я отредактировал приведенный выше код, чтобы добавить еще несколько комментариев для вашего понимания.

4. Вы можете включить Logger.log() строки, чтобы видеть, что регистрируется. Это также даст вам представление об используемых структурах данных.

5. Привет, ra89fi, ты не возражаешь, если я задам тебе еще один вопрос? — аналогично, но в более сложном формате ..?

Ответ №2:

Существует распространенная проблема, связанная с агрегатами

 /**
 * @customfunction
 */
function BLAHBLAHFUNCTION(range) {
  var header = range.shift();
  var vendors = range.map(function(row){return row[1];});
  var r =  range.reduce(function(p, row) {
    if (!p.hasOwnProperty(row[0])) { 
      p[row[0]] = {};
      vendors.forEach(function(vendor){
        if (!p[row[0]].hasOwnProperty(vendor))
          p[row[0]][vendor] = { AB: 0, CD: 0 };
      });
    }
    p[row[0]][row[1]].AB  = row[2]   row[3];
    p[row[0]][row[1]].CD  = row[4]   row[5];
    return p;
  }, {});

  var res = [header.slice(0,2).concat('AB', 'CD')];
  for(var month in r){
    for(vendor in r[month]){
      res.push([month, vendor, r[month][vendor].AB, r[month][vendor].CD]);
    }
  }
  return res;
}
  

введите описание изображения здесь

Мой пример https://docs.google.com/spreadsheets/d/1yo627ZkT7zG7_Aj86Ww0iqUTd2o1xCAY_hDWk9DPsao/edit?usp=sharing

Комментарии:

1. Спасибо за ответ! Я пытался использовать этот код, но он выдает мне сообщение об ошибке, в котором говорится .shift не определен..

2. Функция ожидает ярости.