如何在Google Sheets中基于三列数据实现月度收支及净收益统计
用Google Sheets统计月度收支及净收益方案
假设你的表格列对应关系如下:
- A列:Timestamp(时间戳)
- B列:类型(收入/支出)
- C列:金额
一、单月指标快速计算(用SUMIFS函数)
适合单独统计某一个月的三项数据,无需手动遍历行:
1. 月度总收入
=SUMIFS(C:C, B:B, "收入", A:A, ">="&DATE(2024,5,1), A:A, "<="&EOMONTH(DATE(2024,5,1),0))
参数说明:
C:C:指定要求和的金额列B:B, "收入":筛选类型为「收入」的行A:A, ">="&DATE(2024,5,1):限定时间戳在目标月份第一天及以后A:A, "<="&EOMONTH(...):用EOMONTH自动获取当月最后一天,限定时间范围
2. 月度总支出
把上述公式中的"收入"替换为"支出"即可:
=SUMIFS(C:C, B:B, "支出", A:A, ">="&DATE(2024,5,1), A:A, "<="&EOMONTH(DATE(2024,5,1),0))
3. 月度净收益
直接用总收入减总支出,或合并成单公式:
=SUMIFS(C:C, B:B, "收入", A:A, ">="&DATE(2024,5,1), A:A, "<="&EOMONTH(DATE(2024,5,1),0)) - SUMIFS(C:C, B:B, "支出", A:A, ">="&DATE(2024,5,1), A:A, "<="&EOMONTH(DATE(2024,5,1),0))
二、自动生成全月度汇总表(用QUERY函数)
如果要一次性统计所有月份的收支数据,用QUERY函数直接生成结构化汇总表:
在空白单元格(比如E1)输入:
=QUERY(A:C, "SELECT MONTH(A)+1, YEAR(A), SUM(CASE WHEN B='收入' THEN C ELSE 0 END), SUM(CASE WHEN B='支出' THEN C ELSE 0 END), SUM(CASE WHEN B='收入' THEN C ELSE -C END) GROUP BY YEAR(A), MONTH(A)+1 LABEL MONTH(A)+1 '月份', YEAR(A) '年份', SUM(CASE WHEN B='收入' THEN C ELSE 0 END) '总收入', SUM(CASE WHEN B='支出' THEN C ELSE 0 END) '总支出', SUM(CASE WHEN B='收入' THEN C ELSE -C END) '净收益'", 1)
逻辑说明:
- 按年份+月份自动分组,批量计算每个月的三项指标
MONTH(A)+1修正Google Sheets的月份索引(原函数返回0-11,加1后为1-12)CASE语句区分收支类型计算金额,净收益直接通过「收入-支出」逻辑生成LABEL参数设置中文表头,最后一个1表示原数据包含表头行
三、手动遍历行的脚本实现(Apps Script)
如果一定要通过遍历每一行判断条件来统计,可使用Google Apps Script实现:
打开表格后点击「扩展程序」→「Apps Script」,粘贴以下代码:
function calculateMonthlyBudget() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const data = sheet.getDataRange().getValues(); const headers = data.shift(); // 获取表头行 const timestampCol = headers.indexOf("Timestamp"); const typeCol = headers.indexOf("类型"); const amountCol = headers.indexOf("金额"); const monthlyStats = {}; // 遍历每一行数据 data.forEach(row => { const date = new Date(row[timestampCol]); const year = date.getFullYear(); const month = date.getMonth() + 1; // 转换为1-12月份 const key = `${year}-${month}`; const type = row[typeCol]; const amount = Number(row[amountCol]); // 初始化当月统计数据 if (!monthlyStats[key]) { monthlyStats[key] = { income: 0, expense: 0, net: 0 }; } // 判断类型并累计金额 if (type === "收入") { monthlyStats[key].income += amount; } else if (type === "支出") { monthlyStats[key].expense += amount; } monthlyStats[key].net = monthlyStats[key].income - monthlyStats[key].expense; }); // 将结果写入新工作表 const resultSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("收支汇总") || SpreadsheetApp.getActiveSpreadsheet().insertSheet("收支汇总"); resultSheet.clear(); resultSheet.appendRow(["年份", "月份", "总收入", "总支出", "净收益"]); Object.keys(monthlyStats).forEach(key => { const [year, month] = key.split("-"); const stats = monthlyStats[key]; resultSheet.appendRow([year, month, stats.income, stats.expense, stats.net]); }); }
运行函数后,会自动生成「收支汇总」工作表,包含所有月份的统计结果。
内容的提问来源于stack exchange,提问作者Beta Chad
相关产品推荐
相关产品推荐

