做多个SUMIFS-Google表格脚本编辑器

时间:2019-03-11 19:27:19

标签: javascript google-apps-script

我正在尝试在Google表格脚本编辑器中执行SUMIFS

我想做的是...

我有这个原始表。

enter image description here

我正在尝试创建一个如下所示的报告。.(具有与原始表中的值相匹配的值)

enter image description here

enter image description here

所以我曾经为此使用SUMIFS(value)+ SUMIFS(value)。

是否可以在脚本编辑器中完成相同的工作?

2 个答案:

答案 0 :(得分:1)

关于集料存在一个常见问题

/**
 * @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;
}

enter image description here

我的示例https://docs.google.com/spreadsheets/d/1yo627ZkT7zG7_Aj86Ww0iqUTd2o1xCAY_hDWk9DPsao/edit?usp=sharing

答案 1 :(得分:1)

我编写了一个test函数来读取 ACTIVE 工作表值并在单独的工作表中编写不同的供应商报告。如果您想进一步了解我的代码,请在评论中告诉我。

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]);
  });
}