Notion 目前不支持直接引用API,如果你的投资系统放在Notion,如何每天自动更新股票的价格或者基金的净值呢?
因为Google Sheet 支持函数中,可以在表格中调用新浪财经的API接口,然后写到Google Sheet,然后再利用N8N自动更新。
PS:当然,Google Sheet 原生可以直接用Finance函数来获取港股和美股的价格,但是不支持A股,所以用新浪。
最后,Google sheet只要写一个这样的公式:=GET_STOCK_DATA_SINA(C2, "close") ,上个交易日的价格就会出现了。
====
function GET_STOCK_DATA_SINA(ticker, field) {
if (!ticker) return "ERROR: 请输入代码";
ticker = String(ticker).toLowerCase();
// --- 1. 检查缓存 (Cache Check) ---
var cache = CacheService.getScriptCache();
var cacheKey = "SINA_PRICE_V5_" + ticker; // 升级一下Key防止旧缓存干扰
var cachedPrice = cache.get(cacheKey);
if (cachedPrice != null) {
return parseFloat(cachedPrice);
}
// --- 2. 定义域名列表 (主线路 + 备用线路) ---
var domains = [
'
hq.sinajs.cn',
'
hq.sinajs.com'
];
var options = {
"method": "get",
"headers": { "Referer": "
finance.sina.com.cn", "User-Agent": "Mozilla/5.0" },
"muteHttpExceptions": true
};
var lastError = "";
// --- 3. 循环尝试域名 ---
for (var i = 0; i < domains.length; i++) {
var url = domains[i] + ticker;
try {
var response = UrlFetchApp.fetch(url, options);
// 如果 DNS 错误,通常这里会抛出异常进入 catch
if (response.getResponseCode() !== 200) {
throw new Error("HTTP " + response.getResponseCode());
}
var content = response.getContentText("GBK");
var match = content.match(/\"(.*?)\"/);
// 检查数据有效性
if (!match || match.length < 2 || content.indexOf('=""') > -1) {
// 如果是最后一个域名还没数据,才报错
if (i === domains.length - 1) {
if (ticker.indexOf("gb_") === -1 && /^[a-z]+$/.test(ticker)) {
return "ERROR: 美股请加 gb_";
}
return "ERROR: 无数据";
}
// 否则继续尝试下一个域名
continue;
}
var data = match[1].split(',');
var priceResult = 0;
// --- 提取逻辑 ---
if (ticker.startsWith("gb_")) {
priceResult = parseFloat(data[1]); // 美股
} else if (ticker.startsWith("hk")) {
priceResult = parseFloat(data[3]); // 港股
} else if (ticker.startsWith("f_")) {
priceResult = parseFloat(data[1]); // 基金
} else {
priceResult = parseFloat(data[2]); // A股
}
// --- 4. 成功后写入缓存 ---
if (priceResult > 0) {
cache.put(cacheKey, String(priceResult), 21600); // 缓存 6 小时
}
return priceResult; // 成功返回,结束函数
} catch (e) {
lastError = e.message;
// 如果出错(DNS Error),循环会自动进入下一次,尝试 .com 域名
// 这里打印日志方便调试
console.log("域名 " + domains[i] + " 失败: " + e.message);
}
}
return "ERROR: 所有线路均失败 (" + lastError + ")";
}