google-apps-script - 基于时间的触发器创建而是立即执行函数
问题描述
我一直在尝试设置一个在特定时间向我发送提醒消息的 Telegram Bot,但似乎基于时间的触发器不起作用:提醒消息在我向机器人发送第一条消息后立即发送给我.
我希望向 bot 发送消息是导致构建基于时间的触发器的外部触发器,并且我会在指定时间后收到提醒。
我的代码中的什么导致了我错误的假设?
var delay_ms = [1000, 80000000, 170000000];
var message_list = ["text_correct_1", "text_correct_2", "text_correct_3"];
var initial_state = 0;
function doPost(e) {
var estringa = JSON.parse(e.postData.contents);
if (initial_state == 0) {
createTimeDrivenTriggers();
initial_state = 1;
}
}
function createTimeDrivenTriggers() {
for (var i = 0; i < delay_ms.length; i++){
ScriptApp.newTrigger(delay_reply(i))
.timeBased()
.after(delay_ms[i])
.create();
}
}
function delay_reply(i) {
var notification = {
"method": "sendMessage",
"chat_id": CHATID,
"text": message_list[i],
}
var data = {
"method": "post",
"payload": notification
}
UrlFetchApp.fetch("https://api.telegram.org/botKEY/", data);
}
----更新----- 主要问题现已修复。
//Reference: https://stackoverflow.com/questions/51723459/google-scripts-trigger-and-function-in-different-sheets as suggested by tehhowch
var delay_ms = [100000,200000];//temporal sepeartion need to be large since time trigger in Google App Script is not precise
var message_list = ["text_correct_1", "text_correct_2"];
PropertiesService.getScriptProperties().setProperty("initial_state_prop", 0);
function doPost(e) {
var initial_state= PropertiesService.getScriptProperties().getProperty("initial_state_prop");
var initial_state_int=parseInt(initial_state);
if (initial_state_int == 0) {
createTimeDrivenTriggers();
PropertiesService.getScriptProperties().setProperty("initial_state_prop", 1);
}
}
function createTimeDrivenTriggers() {
for (var i = delay_ms.length-1; i >=0; i++){ //reverse loop in order to get the current trigger right
var TriggerID= ScriptApp.newTrigger("reply") //call string of function
.timeBased()
.after(delay_ms[i])
.create()
.getUniqueId();
PropertiesService.getScriptProperties().setProperty(TriggerID, delay_ms.length-i-1);//
}
}
function reply(){
var e = arguments[0];//call current event
var temp = PropertiesService.getScriptProperties().getProperty(e.triggerUid);
var temp_int = parseInt(temp); //change string to int
var notification = {
"method": "sendMessage",
"chat_id": CHATID,
"text": message_list[temp_int],
}
var data = {
"method": "post",
"payload": notification
}
UrlFetchApp.fetch("https://api.telegram.org/botKEY/", data);
}
解决方案
推荐阅读
- java - 安卓单行吐司
- javascript - JSON 到 HTML 表比较和警报
- python - 加入 2 个列表 Django
- ruby-on-rails - 我在启动 Ruby on Rails 项目时遇到问题
- typescript - 如何将对象值作为元组获取
- typescript - MongoMemoryServer ; 未处理的错误
- css - 超出其定义宽度的元素
- swift - 从 CSV 在 Core Data 中创建 2000 万条记录 - macOS
- java - Spring JpaRepository getOne() for table with PK as String
- python - 是否有任何 Python 方法可以将 base64 编码的字符串转换为 Image