一、背景
- 通过谷歌文档管理自己的股票池,并希望能自定义条件,主动通知
- 工作上, 需要能在跑完压测后,把压测数据自动同步到谷歌文档,并展示出来
二、谷歌文档函数
提供了一系列的官方云函数/公式,可实现类似爬虫的功能,详见谷歌文档函数列表 这里举两个我用到的函数。
- GOOGLEFINANCE。这个函数可以实时通过谷歌财经实时获取到指定股票的数据,包括价格、市盈率等,例如
=GOOGLEFINANCE("NASDAQ:GOOGL","pe")
可获取到google公司实时的市盈率 - IMPORTHTML。可以爬取任意网站的表格。例如
=IMPORTHTML("http://en.wikipedia.org/wiki/Demographics_of_India","table",4)
可获取到该网站下, 第四个table的内容
三、官方脚本–AppScript
AppScript有个类支持访问和操作谷歌文档–Class Spreadsheet 这里我想达到的效果是, 定时去跑某个函数, 然后当谷歌文档中的数据,满足某个条件的话,即给我发一封提醒邮件。 定时执行脚本可以用触发器配执行时机的策略,脚本参考如下:
function sendEmail(content) {
var message = 'stock attack!! please check: https://docs.google.com/spreadsheets/d/1iLPQ8igJyfCK8uncMJ1p6XsnnkCayZ8U8KMk9HM4Dyg/edit#gid=0'; // Second column
var subject = content;
MailApp.sendEmail("[email protected]", subject, message);
}
function checkPEG() {
// 1. fetch sheet data
var stockSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("stocks");
var pegRange = stockSheet.getRange("B12:X12");
var pegValues = pegRange.getValues()[0];
var buyFlag=0;
// 2. traverse the valuse i care
for (var i=0; i<pegValues.length;i++) {
if (pegValues[i]<=0.6) {
Logger.log(pegValues[i]);
buyFlag=1;
}
}
// 3. find one, send me a mail
if(buyFlag) {
sendEmail("buy signal!")
}
var pegSellRange=stockSheet.getRange("B15:X15");
var pegSellValues=pegSellRange.getValues()[0];
var sellFlag=0;
for (var i=0; i<pegSellValues.length;i++) {
if (pegSellValues[i]==1) {
Logger.log(pegSellValues[i]);
sellFlag=1;
}
//Logger.log(pegValues[i]);
}
if(sellFlag) {
sendEmail("sell signal!")
}
}
四、自主管理谷歌文档–base on python
更进一步地,我们希望能用我们自己的脚本去操作谷歌文档。
- 首先,需要到Google Developers Console创建一个项目,并注册一个service account和下载对应的凭证, 可参考Using OAuth2 for Authentication
- 接着, 安装python环境, 引入oauth2client
pip install --upgrade oauth2client
- 然后,引入开源的gspread
pip install gspread
, 参照gspread官方文档就可以愉快地蹂躏、操作谷歌文档了 - 最后,因为需要访问google的api,所以不能用国内的机器,要用申请香港/国外的主机。 鹅厂内部的话, 可以用dev的机器,配置代理的国 最后附上小小的例子, 实现的功能是往指定的google文档追加一行记录
...
scope = ['https://spreadsheets.google.com/feeds']
credentials = ServiceAccountCredentials.from_json_keyfile_name('lgame-8570bdc1de6e.json', scope)
gc = gspread.authorize(credentials)
# Open a worksheet from spreadsheet with one shot
wks = gc.open_by_key("1l78DlUkTpsqLRFj-1BMMMzlnKNrE09eZVP7ivpK4Gn4").worksheet("ZoneSvr")
# wks.insert_row([7, 15, 18])
wks.append_row([7, 15, 18])
print wks.get_all_records()
...