编写简单的辅助脚本来在 Google 表格上记账
我的第二份工作入职在即,而这一次则真的是完全跑到了一个陌生的城市了。租房,购置相关用品,还尚未工作钱就花掉一堆。尽管我个人之前一直都没有过记账的习惯,但为了让自己能够搞清楚自己的钱都花在哪里了,于是还是决定整个超级无敌无脑简单的账本出来。
顺带一提,这篇文章仅仅是写下来记录一下整个过程,其实整个文章并没有多高的技术含量。如果你熟悉 Excel vba 或者 Google Spreadsheets 脚本的编写而又期望学习一些新的技巧的话,这篇文章不是你想要的文章。

图在这儿,该文章所指的脚本是给数值变动那一列染色的脚本。顺便上表数值是瞎填的
选型?
首先决定的就是搜索现有的账本工具,而发现一部分账本软件过于复杂,另一部分则是使用他们自己的云服务去存储这些信息。由于感觉自己的需求的确很简单,只需要简单的支出收入计算就可以满足,故最终选择不使用复杂的记账平台和软件。
收入支出计算,差不多就是一个 Excel 就能做到的事情,故开始考虑直接使用 Excel 表格加 vba 来辅助完成工作。但考虑到我平时需要使用手机处理事情,以及曾经被Excel Online的用户体验“感动”过,我决定使用另一家的服务来做这件事,也就是 Google Spreadsheets 。
开发?
不同于以往写小工具的时候的复杂需求和复杂流程,如果选择使用表格软件完成这个记账任务其实只需要在指定的单元格填填东西编写公式就好了。于是填写好列的表头:时间,内容,数值变动,变动后结果和备注。然后就完事儿了。
作为账本,需要自动计算的东西其实就两个,即从初始金额开始每次数值变动后的“变动后结果”,以及当前页账本整个算下来的余额。而这两个需求其实也非常简单,只需要公式即可完成。其中整页余额只需要找个格子写个 SUM(C4:C200) (假设变动的值从在C列,从行4开始,计算到4到200行值的和)把变动的值加一块儿就行了。而计算当前行金额变动后的结果也很简单,只需把上一行的结果和这一行变动的数值相加即可。在我的这个例子中,即当前单元格的值为这个单元格上方的值加上这个单元格左方的值,即公式 =INDIRECT("R[-1]C[0]",false)+INDIRECT("R[0]C[-1]",false) 。Tada!一个无脑账本就这么完成了(你什么都没做啊喂!)。
就这么结束了?
由于如果仅仅如此的话,一切的确太过简陋以至于连一篇博客也水不完, 于是还是决定加一点东西进去,即按照颜色标识收入和支出,而这就需要编写简单的脚本处理了。事实上,相比正常的软件开发,这个需求也显得过于简单,所以我们很容易就能得到这种伪代码:
if (这次花的钱钱 > xxx && 这次花的钱钱 < yyy) {
这个格子.设置背景颜色(某个颜色);
} else if (...) {
//...
}
于是我们要做的事情就是,翻文档,看看如何做到上面的事情。
大致阅读文档发现代码有一股 JavaScript 的味道,于是就决定先按 js 的语法套路来写,如果出了问题再查。通过查阅文档可知,获得当前表的方式就是 SpreadsheetApp.getActiveSheet() ,而得到现有表格的数据范围(即这个表的数据情况)则是 getDataRange() 了。当我们对得到的数据取值,只需要 getValues() 即可得到一个映射表,而取得数据范围内某个格子则只需 getCell(行, 列) ,相应的,取得单元格的值使用 getValue() ,为单元格设置背景使用 setBackground("颜色")。
于是我们就可以通过这些来实现为每一个现有行的收入支出结果那一列标识不同背景颜色的代码了。我们在 工具 > 代码编辑器 编写代码即可,代码也异常简单,如下所示。
function setDebtColor() {
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getDataRange();
var data = range.getValues();
for (var i = 4; i <= 200; i++) { // index start at 1
if (i > data.length) break;
// debt row
var cell = range.getCell(i, 3);
var cellValue = cell.getValue();
if (cellValue - 0 > 0.001) { // incoming
if (cellValue > 61 && cellValue <= 261) cell.setBackground("#a0c238");
else if (cellValue > 261) cell.setBackground("#0074bf");
else cell.setBackground("#c4fdb3");
} else if (cellValue - 0 < -0.001) { // outcoming
if (cellValue < -61 && cellValue >= -261) cell.setBackground("#de9610");
else if (cellValue < -261) cell.setBackground("#c93a40");
else cell.setBackground("#fffacd");
} else {
cell.setBackground(null);
}
}
}
如上我们假设C列的4~200行为需要填色的格子,为支出填红色,收入填绿色(大致..),并根据两个阈值(61和261,别问为啥是这个数)把收入或支出的量的多少分为三段填以不同深浅程度的颜色。填充到最后就完成啦。有意思的是,写这段代码之前我完全不熟悉 Spreadsheet 脚本语言的用法(vba我也不熟悉...),这样竟然没碰到语法错误...
值得一提的是,其一,getCell() 的下标是从 1 开始的,头一次点调试发现内容那一列变色了,当时还觉得挺好看,后来才反应过来不对。另一个是,由于实在懒得去系统的了解这一套脚本语言编写方式之类,故我也没有研究有没有浮点数比较运算的问题,于是对于判断等于0这一点,用了上面写的那种方法。
尾声...
我终于又水了一篇博客,于是对于码农来说,能快速翻阅文档查 API 手册来完成自己想要的任务,应该算是基本素养吧。(写这么一篇博客花的时间是写那一小段脚本的三倍多了吧
更重要的是终于知道我的小钱钱都去哪里了(不对
明天就是新工作入职第一天,水一篇博客,希望一切顺利。
2018年4月1日21点50分
编写简单的辅助脚本来在 Google 表格上记账的更多相关文章
- ROS Learning-010 beginner_Tutorials 编写简单的启动脚本文件(.launch 文件)
ROS Indigo beginner_Tutorials-09 编写简单的启动脚本文件 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14.0 ...
- 编写简单的spring mvc程序,在tomcat上部署
编写简单的spring mvc程序,在tomcat上部署 1 用java 配置spring mvc ,可以省去web.xmlpackage hello;import org.springframewo ...
- 小鸟初学Shell编程(二)编写简单的Shell脚本
Shell脚本 编写Python.PHP脚本通常需要掌握语言的函数,那么Shell脚本则不需要,只需要掌握Linux命令就可以编写Shell脚本,因为Shell脚本就是由多个Linux命令组成,通过将 ...
- (八) .launch文件 ---编写简单的启动脚本文件
下面我们将介绍,如何编写一个启动脚本程序:(.launch文件) 还记得我们在 创建ROS软件包教程 中创建的第一个程序包(beginner_tutorials)吗,现在我们要使用它. 在 begin ...
- 利用 Powershell 编写简单的浏览器脚本
生活中有很多事情是低效益,重复性.比如每天上某些网站,先登录再签到打卡,比如每隔一段时间清理回收站的文件等等.一个成熟的软件工程师应该想到用软件解决他. 对于这些简单的小任务,一般用脚本实现.比如Py ...
- python模块之sys和subprocess以及编写简单的主机扫描脚本
python模块之sys和subprocess以及编写简单的主机扫描脚本 1.sys模块 sys.exit(n) 作用:执行到主程序末尾,解释器自动退出,但是如果需要中途退出程序,可以调用sys.e ...
- 学习 Linux,101: 自定义或编写简单脚本【转】
转自:http://www.ibm.com/developerworks/cn/linux/l-lpic1-105-2/index.html 学习如何使用标准的 shell 语法.循环和控制结构,以及 ...
- case编写的httpd简单启停脚本
case编写的httpd简单启停脚本 #!/bin/bash HTTPD="/etc/init.d/httpd" . /etc/init.d/functions case &quo ...
- 手动编写一个简单的loadrunner脚本
loadrunner除了自动录制脚本外,还可以手动编写脚本,通过右键+inset step添加步骤,还可以手动添加事务,集合点等 下面是一个简单的Action脚本,服务是运行在本机的flask服务: ...
随机推荐
- nest exception is java.sql.SQLException:ORA-01476:除数为0
1.错误描述 nest exception is java.sql.SQLException:ORA-01476:除数为0 2.错误原因 3.解决办法
- .net core 环境安装失败,错误:0x80072EE2
安装[DotNetCore.1.0.1-VS2015Tools.Preview2.0.3.exe]失败,提示这个界面 查看log发现,发现猫腻,然后copy下链接,用迅雷手动下载[AspNetCore ...
- iOS - XMPP 的使用
1.XMPP XMPP 是一个基于 Socket 通信的即时通讯的协议,它规范了即时通信在网络上数据的传输格式,比如登录,获取好友列表等等的格式.XMPP 在网络传输的数据是 XML 格式. 开发架构 ...
- ubuntu安装pycharm桌面快捷方式
1.sudo gedit /usr/share/applications/Pycharm.desktop 2.输入 [Desktop Entry] Encoding=UTF-8 Name=Pychar ...
- 教你如何制作网页上的友情链接--JavaScript基础
大部分网站的首页都有友情链接的功能,此功能可通过location对象的href属性来实现…… href属性:设置或检索完整的url字符串 1."友情链接制作"示例代码: <! ...
- Css Secret 案例全套
Css Secret 案例全套 github地址 案例地址 该书揭示了 47 个鲜为人知的 CSS 技巧,主要内容包括背景与边框.形状. 视觉效果.字体排印.用户体验.结构与布局.过渡与动画等.去年买 ...
- 搞定导致CPU爆满的“罪魁祸首”
昨天,正忙着,一个用户来电,说一个系统非常缓慢,导致整个系统无法正常使用,必须马上处理,先看系统资源,通过用户反馈的信息,内存,IO没问题,CPU资源严重紧张,idle持续为零,堆积任务达几百个,系统 ...
- [BZOJ2733] [HNOI2012] 永无乡 (splay启发式合并)
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- easyUI datagrid 多行多列数据渲染异常缓慢原因以及解决方法
原因 最近,在优化之前公司帮联想(外包)做的一个老的后台管理系统,由于项目是基于easy UI框架,页面是后台用jsp实现的,再加上在公司推行前后端分离的实践,大部分项目都基于vue采用前后端分离去实 ...
- java枚举类型举例(基础)
enum Mycolor{红色,绿色,蓝色}; public class asd { public static void main(String[] args) { Mycolor[] allcol ...