如何根据条件从另一个列中找到某些列值的总和?
How to find the sum of certain column values by conditions from another one?
有 2 列。第一个具有日期格式 DD.MM.YYYY 的值,第二个具有整数值。如何根据匹配第一列月份的条件产生第二列数字的总和? For ex Im interesting in the sum of the values that match MONTH() = 11?
每月总和
function myfunk() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Sheet0');
const vs = sh.getRange(2,1,sh.getLastRow() - 1, 2).getValues();
let sums = {pA:[]};
vs.forEach((r => {
let p = r[0].split('.').filter((e,i) => i > 0).reduce((a,c,idx) => {
if(idx > 0) a += '.';
a += c;
return a;
});
if(!sums.hasOwnProperty(p)) {
sums[p]= r[1];
sums.pA.push(p);
} else {
sums[p] += r[1]
}
}));
let html = '<style> td,th{border: 1px solid black;}</style><table><tr><th>Month</th><th>Sum</th></tr>';
sums.pA.forEach(p => {
html += `<tr><td>${p}</td><td>${sums[p]}</td></tr>`
});
SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(html),'Monthly Sums')
}
数据:
求和对话框:
已向 osh 添加每月金额
function myfunk() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Sheet0');
const osh = ss.getSheetByName('Sheet1');
osh.clear();
const vs = sh.getRange(2,1,sh.getLastRow() - 1, 2).getValues();
let sums = {pA:[]};
vs.forEach((r => {
let p = r[0].split('.').filter((e,i) => i > 0).reduce((a,c,idx) => {
if(idx > 0) a += '.';
a += c;
return a;
});
if(!sums.hasOwnProperty(p)) {
sums[p]= r[1];
sums.pA.push(p);
} else {
sums[p] += r[1]
}
}));
let html = '<style> td,th{border: 1px solid black;}</style><table><tr><th>Month</th><th>Sum</th></tr>';
let arr = [['Month','Sums']];
sums.pA.forEach(p => {
html += `<tr><td>${p}</td><td>${sums[p]}</td></tr>`
arr.push([`${p}`,`${sums[p]}`])
});
SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(html),'Monthly Sums');
osh.getRange(1,1,arr.length,arr[0].length).setValues(arr);
}
假设你的原始数据在一个叫Sheet1
的sheet中,你在A1和B1中有headers,而你发布的数据集在A2:B14 单元格中没有任何内容 A15:B。在新的 sheet 中,在单元格 A1 中输入此公式:
=ArrayFormula(QUERY({DATE(YEAR(Sheet1!A2:A),MONTH(Sheet1!A2:A),1),B2:B},"Select Col1, SUM(Col2) WHERE Col2 Is Not Null GROUP BY Col1 LABEL Col1 'MONTH', SUM(Col2) 'TOTAL' FORMAT Col1 'mmm yyyy'"))
此 QUERY
将产生两个 headers(您可以根据需要在 QUERY
的 LABEL
部分中进行更改)以及所有 months/years 存在于数据集中。
QUERY
作用于一个虚拟数组,该数组首先根据原始日期的月份和年份将 Sheet1!A2:A 中的所有日期转换为新的 DATE
s,但都落在这个月的第一天。这允许 SUM
分组在 QUERY
中。然后 QUERY
的 FORMAT
部分将这些标准化日期转换为只显示月份和年份部分。
调整 sheet 名称和引用范围以适应实际数据的 sheet 名称和数据范围。
注意(在了解到 OP 的语言环境是俄罗斯之后):
此版本适用于您的语言环境...
=ArrayFormula(QUERY({DATE(YEAR(Sheet1!A2:A); MONTH(Sheet1!A2:A);1) \ Sheet1!B2:B}; "Select Col1, SUM(Col2) WHERE Col2 Is Not Null GROUP BY Col1 LABEL Col1 'MONTH', SUM(Col2) 'TOTAL' FORMAT Col1 'mmm yyyy'"))
有 2 列。第一个具有日期格式 DD.MM.YYYY 的值,第二个具有整数值。如何根据匹配第一列月份的条件产生第二列数字的总和? For ex Im interesting in the sum of the values that match MONTH() = 11?
每月总和
function myfunk() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Sheet0');
const vs = sh.getRange(2,1,sh.getLastRow() - 1, 2).getValues();
let sums = {pA:[]};
vs.forEach((r => {
let p = r[0].split('.').filter((e,i) => i > 0).reduce((a,c,idx) => {
if(idx > 0) a += '.';
a += c;
return a;
});
if(!sums.hasOwnProperty(p)) {
sums[p]= r[1];
sums.pA.push(p);
} else {
sums[p] += r[1]
}
}));
let html = '<style> td,th{border: 1px solid black;}</style><table><tr><th>Month</th><th>Sum</th></tr>';
sums.pA.forEach(p => {
html += `<tr><td>${p}</td><td>${sums[p]}</td></tr>`
});
SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(html),'Monthly Sums')
}
数据:
求和对话框:
已向 osh 添加每月金额
function myfunk() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Sheet0');
const osh = ss.getSheetByName('Sheet1');
osh.clear();
const vs = sh.getRange(2,1,sh.getLastRow() - 1, 2).getValues();
let sums = {pA:[]};
vs.forEach((r => {
let p = r[0].split('.').filter((e,i) => i > 0).reduce((a,c,idx) => {
if(idx > 0) a += '.';
a += c;
return a;
});
if(!sums.hasOwnProperty(p)) {
sums[p]= r[1];
sums.pA.push(p);
} else {
sums[p] += r[1]
}
}));
let html = '<style> td,th{border: 1px solid black;}</style><table><tr><th>Month</th><th>Sum</th></tr>';
let arr = [['Month','Sums']];
sums.pA.forEach(p => {
html += `<tr><td>${p}</td><td>${sums[p]}</td></tr>`
arr.push([`${p}`,`${sums[p]}`])
});
SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(html),'Monthly Sums');
osh.getRange(1,1,arr.length,arr[0].length).setValues(arr);
}
假设你的原始数据在一个叫Sheet1
的sheet中,你在A1和B1中有headers,而你发布的数据集在A2:B14 单元格中没有任何内容 A15:B。在新的 sheet 中,在单元格 A1 中输入此公式:
=ArrayFormula(QUERY({DATE(YEAR(Sheet1!A2:A),MONTH(Sheet1!A2:A),1),B2:B},"Select Col1, SUM(Col2) WHERE Col2 Is Not Null GROUP BY Col1 LABEL Col1 'MONTH', SUM(Col2) 'TOTAL' FORMAT Col1 'mmm yyyy'"))
此 QUERY
将产生两个 headers(您可以根据需要在 QUERY
的 LABEL
部分中进行更改)以及所有 months/years 存在于数据集中。
QUERY
作用于一个虚拟数组,该数组首先根据原始日期的月份和年份将 Sheet1!A2:A 中的所有日期转换为新的 DATE
s,但都落在这个月的第一天。这允许 SUM
分组在 QUERY
中。然后 QUERY
的 FORMAT
部分将这些标准化日期转换为只显示月份和年份部分。
调整 sheet 名称和引用范围以适应实际数据的 sheet 名称和数据范围。
注意(在了解到 OP 的语言环境是俄罗斯之后):
此版本适用于您的语言环境...
=ArrayFormula(QUERY({DATE(YEAR(Sheet1!A2:A); MONTH(Sheet1!A2:A);1) \ Sheet1!B2:B}; "Select Col1, SUM(Col2) WHERE Col2 Is Not Null GROUP BY Col1 LABEL Col1 'MONTH', SUM(Col2) 'TOTAL' FORMAT Col1 'mmm yyyy'"))