Google 脚本定时计划扫描列的值然后发送 webhook
Google Script timed schedule to scan column for value then send webhook
我有一个 Google Sheet 来保存我有兴趣购买的股票清单。如果不符合我的目标价格,则 M 列中的值为“0”,如果符合,则为大于“0”的值。 N 列是我今天已经投资的金额。
我希望 Google 脚本每 15 分钟左右扫描一次 M 列,并检查 M 列中的值是否大于 N 列中的值,如果是大于 0.
如果它找到符合这两个条件的行,那么它会发送一个 webhook 到 URL,其参数基于其他一些列,附加到 webhook URL,如下所示:
?ticker=(C 列)&Company=(A 列)
再加几列。
这可能吗?
提前致谢。
编辑:抱歉,我应该澄清一下,我知道不同类型的 Google 项目触发器(定时等),它是搜索列和发送我遇到问题的 webhook。基于下面@fullfine 的精彩回答,这是我当前的代码(我将在下面写下我现在无法弄清楚的问题):
function main() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Watchlist");
var m = ss.getRange("M1:M50").getValues()
var n = ss.getRange("N1:N50").getValues()
for (var i = 0; i < m.length; i++) {
if (m[i] > n[i] && m[i] > 0) {
sendWebHook(i)
}
}
}
function sendWebHook(i) {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Watchlist");
var a = ss.getRange("A"+i)
UrlFetchApp.fetch('https://webhookexample.com?Row=a3')
}
所以我需要弄清楚如何用实际行号替换我的 webhook 中的“a3”。这将是我可以用来解决最初问题的解决方法。
或者,如果有人可以更正脚本以包含行其余部分的值以在 webhook 中传递,那将是非常棒的。我不擅长编码,但我想也许我会从该行的每个必需列中获取值,创建新变量,然后将它们传递到 webhook?
另一个问题是,当 webhook 当前运行时,服务 (integromat) 可以正常接收它,但在 Google 应用程序中 returns 一个 400 代码。
回答
如果您想获得准确的帮助,请使用所有必要的详细信息编辑问题。但是,我可以根据您的解释给您一些指导。
要按一定的时间间隔执行函数,有Time-driven triggers。它们会根据您想要的标准调用您选择的函数,例如每 15 分钟一次。要创建一个,您必须转到左侧栏,单击 Triggers -> Add Trigger
,然后在 Select event source
中选择 Time driven
。在此菜单中还可以选择要调用的函数。
在这种情况下,我为您的任务附加了几个函数。第一个是触发器调用的那个。它采用列 M
和列 N
的前五个值,并对它们中的每一个执行所需的比较:M
的值大于 N
和更大比零。如果是这种情况,它会调用第二个函数,该函数负责发送 webhook。它接收列 M
和 N
的索引,以便能够在具有相同索引的其他列中查找其他值。例如,如果 M3
大于 N3
且大于零,则此函数接收 3 以获取 A3
.
的值
代码
function main() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
var m = ss.getRange("M1:M5").getValues()
var n = ss.getRange("N1:N5").getValues()
for (var i = 0; i < m.length; i++) {
if (m[i] > n[i] && m[i] > 0) {
sendWebHook(i)
}
}
}
function sendWebHook(i) {
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
var a = ss.getRange("A"+i)
}
参考文献:
好吧,多亏了@fullfine 和对这个网站的一些搜索,我设法破解了它。
为了从正确的行中获取正确的值,我必须取 [i] 值并加 1。
下面是对电子表格中每个选定列的作用的描述,因此您可以在我的代码中看到它的作用:
AB 列 - 通过查看当前时间检查股市是否开市。是或否
F 列 - 我选择的股票类别。在这种情况下,我只想 运行 脚本来查找股息股票。
R 列 - 我今天应该投资多少。这是基于我的一套规则,并且是基于公式的。
由于 webhook 的变量名称,所有其他列都应该是不言自明的。
function main() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Watchlist");
var ab = ss.getRange("ab1:ab100").getValues()
var m = ss.getRange("M1:M100").getValues()
var f = ss.getRange("F1:F100").getValues()
var r = ss.getRange("R1:R100").getValues()
for (var i = 0; i < m.length; i++) {
if (r[i] > 0 && f[i] == 'Current Dividends' && ab[i] == 'Yes') {
sendWebHook(i)
}
}
}
function sendWebHook(i) {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Watchlist");
var row = (i+1)
var company = ss.getRange("A"+row).getValues()
var ticker = ss.getRange("C"+row).getValues()
var currentPrice = ss.getRange("D"+row).getValues()
var currency = ss.getRange("G"+row).getValues()
var percent = ss.getRange("AA"+row).getValues()
var invest = ss.getRange("M"+row).getValues()
var invested = ss.getRange("N"+row).getValues()
var purchasePrice = ss.getRange("P"+row).getValues()
var status = ss.getRange("U"+row).getValues()
var purchasePricePercent = ss.getRange("Q"+row).getValues()
UrlFetchApp.fetch('https://hook.integromat.com/EXAMPLEWEBHOOK?ticker=' + ticker + '&invest=' + invest + '&invested=' + invested + '&company=' + company + '¤tPrice=' + currentPrice + '¤cy=' + currency + '&percent=' + percent + '&purchasePrice=' + purchasePrice + '&purchasePricePercent=' + purchasePricePercent + '&status=' + status)
}
现在,当股票价格在我的买入区间内时,我会收到一条 Facebook 消息。
我有一个 Google Sheet 来保存我有兴趣购买的股票清单。如果不符合我的目标价格,则 M 列中的值为“0”,如果符合,则为大于“0”的值。 N 列是我今天已经投资的金额。
我希望 Google 脚本每 15 分钟左右扫描一次 M 列,并检查 M 列中的值是否大于 N 列中的值,如果是大于 0.
如果它找到符合这两个条件的行,那么它会发送一个 webhook 到 URL,其参数基于其他一些列,附加到 webhook URL,如下所示:
?ticker=(C 列)&Company=(A 列)
再加几列。
这可能吗?
提前致谢。
编辑:抱歉,我应该澄清一下,我知道不同类型的 Google 项目触发器(定时等),它是搜索列和发送我遇到问题的 webhook。基于下面@fullfine 的精彩回答,这是我当前的代码(我将在下面写下我现在无法弄清楚的问题):
function main() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Watchlist");
var m = ss.getRange("M1:M50").getValues()
var n = ss.getRange("N1:N50").getValues()
for (var i = 0; i < m.length; i++) {
if (m[i] > n[i] && m[i] > 0) {
sendWebHook(i)
}
}
}
function sendWebHook(i) {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Watchlist");
var a = ss.getRange("A"+i)
UrlFetchApp.fetch('https://webhookexample.com?Row=a3')
}
所以我需要弄清楚如何用实际行号替换我的 webhook 中的“a3”。这将是我可以用来解决最初问题的解决方法。
或者,如果有人可以更正脚本以包含行其余部分的值以在 webhook 中传递,那将是非常棒的。我不擅长编码,但我想也许我会从该行的每个必需列中获取值,创建新变量,然后将它们传递到 webhook?
另一个问题是,当 webhook 当前运行时,服务 (integromat) 可以正常接收它,但在 Google 应用程序中 returns 一个 400 代码。
回答
如果您想获得准确的帮助,请使用所有必要的详细信息编辑问题。但是,我可以根据您的解释给您一些指导。
要按一定的时间间隔执行函数,有Time-driven triggers。它们会根据您想要的标准调用您选择的函数,例如每 15 分钟一次。要创建一个,您必须转到左侧栏,单击 Triggers -> Add Trigger
,然后在 Select event source
中选择 Time driven
。在此菜单中还可以选择要调用的函数。
在这种情况下,我为您的任务附加了几个函数。第一个是触发器调用的那个。它采用列 M
和列 N
的前五个值,并对它们中的每一个执行所需的比较:M
的值大于 N
和更大比零。如果是这种情况,它会调用第二个函数,该函数负责发送 webhook。它接收列 M
和 N
的索引,以便能够在具有相同索引的其他列中查找其他值。例如,如果 M3
大于 N3
且大于零,则此函数接收 3 以获取 A3
.
代码
function main() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
var m = ss.getRange("M1:M5").getValues()
var n = ss.getRange("N1:N5").getValues()
for (var i = 0; i < m.length; i++) {
if (m[i] > n[i] && m[i] > 0) {
sendWebHook(i)
}
}
}
function sendWebHook(i) {
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
var a = ss.getRange("A"+i)
}
参考文献:
好吧,多亏了@fullfine 和对这个网站的一些搜索,我设法破解了它。
为了从正确的行中获取正确的值,我必须取 [i] 值并加 1。
下面是对电子表格中每个选定列的作用的描述,因此您可以在我的代码中看到它的作用:
AB 列 - 通过查看当前时间检查股市是否开市。是或否
F 列 - 我选择的股票类别。在这种情况下,我只想 运行 脚本来查找股息股票。
R 列 - 我今天应该投资多少。这是基于我的一套规则,并且是基于公式的。
由于 webhook 的变量名称,所有其他列都应该是不言自明的。
function main() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Watchlist");
var ab = ss.getRange("ab1:ab100").getValues()
var m = ss.getRange("M1:M100").getValues()
var f = ss.getRange("F1:F100").getValues()
var r = ss.getRange("R1:R100").getValues()
for (var i = 0; i < m.length; i++) {
if (r[i] > 0 && f[i] == 'Current Dividends' && ab[i] == 'Yes') {
sendWebHook(i)
}
}
}
function sendWebHook(i) {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Watchlist");
var row = (i+1)
var company = ss.getRange("A"+row).getValues()
var ticker = ss.getRange("C"+row).getValues()
var currentPrice = ss.getRange("D"+row).getValues()
var currency = ss.getRange("G"+row).getValues()
var percent = ss.getRange("AA"+row).getValues()
var invest = ss.getRange("M"+row).getValues()
var invested = ss.getRange("N"+row).getValues()
var purchasePrice = ss.getRange("P"+row).getValues()
var status = ss.getRange("U"+row).getValues()
var purchasePricePercent = ss.getRange("Q"+row).getValues()
UrlFetchApp.fetch('https://hook.integromat.com/EXAMPLEWEBHOOK?ticker=' + ticker + '&invest=' + invest + '&invested=' + invested + '&company=' + company + '¤tPrice=' + currentPrice + '¤cy=' + currency + '&percent=' + percent + '&purchasePrice=' + purchasePrice + '&purchasePricePercent=' + purchasePricePercent + '&status=' + status)
}
现在,当股票价格在我的买入区间内时,我会收到一条 Facebook 消息。