javascript - Google Sheet 脚本编辑器 - 报告格式的多个 Sumif

标签 javascript google-apps-script

我正在尝试执行以下任务。

下面列出了测试版本

https://docs.google.com/spreadsheets/d/1K1UFjUn4o_ciB6ZUo8E23G0E-S7tKTssr6bXRAlOSo8/edit?usp=sharing

我正在尝试填写来自“RAW”选项卡的“大西洋”、“中部”、“西部”、“东部”选项卡中黄色突出显示的行。

基本上,每个区域都有选项卡,然后每个选项卡中的每个 vendor 按月份列出表格

我如何在 Google 应用程序脚本中执行此操作?

最佳答案

试试这个代码。首先从 RAW 工作表中删除 conversion Notes 行。

function test() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var rawSheet = ss.getSheetByName('RAW');
  var rawValues = rawSheet.getDataRange().getValues();
  rawValues.shift();

  // will be months present in data
  // { 0: true, 1: true ... }
  var mos = {};
  // well be vendors present in data
  // { Google: true ... }
  var vens = {};

  // data structure
  var ds = {};

  rawValues.forEach(function(row) {
    // check below cols
    var month = Math.floor(new Date(row[2]).getMonth());
    var zone = row[12];
    var ven = row[13];

    mos[month] = true; // set month on mos
    vens[ven] = true; // set vendor on vens

    ds[zone] = ds[zone] || {}; // zone
    ds[zone][ven] = ds[zone][ven] || {}; // vendor

    // set conversion value
    if (!ds[zone][ven][month]) {
      ds[zone][ven][month] = [
        // A
        parseInt(row[4]) + parseInt(row[5]),
        // B
        parseInt(row[6]) + parseInt(row[7]),
        // C
        parseInt(row[8]) + parseInt(row[9]),
        // D
        parseInt(row[10]) + parseInt(row[11])
      ];
    } else {
      ds[zone][ven][month] = [
        // A
        ds[zone][ven][month][0] + parseInt(row[4]) + parseInt(row[5]),
        // B
        ds[zone][ven][month][1] + parseInt(row[6]) + parseInt(row[7]),
        // C
        ds[zone][ven][month][2] + parseInt(row[8]) + parseInt(row[9]),
        // D
        ds[zone][ven][month][3] + parseInt(row[10]) + parseInt(row[11])
      ];
    }
  });

  Logger.log(vens);
  // put empty vendor for a zone if not exists
  Object.keys(ds).forEach(function(z) {
    ds[z] = ds[z] || {};
    Object.keys(vens).forEach(function(v) {
      ds[z][v] = ds[z][v] || {};
    });
  });
  // Logger.log(ds);

  var months = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11'];
  // filter months to get months present in sheet data in order
  months = months.filter(function(m) {
    return mos[m] == true;
  });
  // Logger.log(months);

  // Z : { V: [ row, row... ]... }
  var rs = {};
  Object.keys(ds).forEach(function(z) {
    rs[z] = rs[z] || {};

    Object.keys(ds[z]).forEach(function(v) {
      rs[z][v] = rs[z][v] || [];

      months.forEach(function(m) {
        if (ds[z][v][m]) {
          rs[z][v].push(ds[z][v][m]);
        } else {
          rs[z][v].push(['N/A', 'N/A', 'N/A', 'N/A']);
        }
      });
    });
  });
  // Logger.log(rs);

  // start of vendors in all sheets, [row, col]
  // must be same in all zone sheets, which is now
  var pos = {
    Google: [3, 7],
    Nielsen: [21, 7],
    IBM: [39, 7],
    Samsung: [57, 7]
  };

  // write rows
  Object.keys(rs).forEach(function(z) {
    try {
      ss.insertSheet(z);
    } catch (e) {}

    var sh = ss.getSheetByName(z);
    Object.keys(rs[z]).forEach(function(v) {
      sh.getRange(pos[v][0], pos[v][1], rs[z][v].length, 4).setValues(rs[z][v]);
    });
  });
}

关于javascript - Google Sheet 脚本编辑器 - 报告格式的多个 Sumif,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55126452/

相关文章:

JavaScript 'or' 语句

javascript - 在select上同时注册onchange和onclick时,点击事件被触发两次

javascript - Angular 服务和观察变量

javascript - 类型错误 : Cannot find function setvalue in object Range

html - 当通过应用程序脚本部署为 Web 应用程序时,任何知道该链接的人都可以在 Google 云端硬盘中查看图像,但不会在 IOS 的网络浏览器中显示

javascript - 将数组从javascript发送到Spring Controller

javascript - Rails 和元素特定的 javascript

javascript - 如何使多个依赖下拉输入更有效?

google-apps-script - 是否可以导出 Google Apps 脚本执行记录

javascript - 提示在谷歌应用程序脚本中不起作用