GASでDiscord時報botを作る
https://gyazo.com/590805f6d393090e75cf147a6853c23c
サムネ
アラート部分はこれを参考にした
用途
ごはんタイムアラート
必要なのは
14時、21時、22時、23時にアラートをならす
配列で管理
土日祝は時報をしない
GASを使って、以下の条件を満たすトリガーを作りたいです
1、毎日21時、22時、23時に実行する 時刻は配列で管理する
2、土日祝では実行しない
この要件を満たす CreateTriggerの作り方はありますか?
こんな感じのが出た
code:javascript
function createTrigger() {
// 現在のトリガーをすべて取得
var allTriggers = ScriptApp.getProjectTriggers();
// 既存のトリガーを削除(すべてのトリガーを再作成するため)
for (var i = 0; i < allTriggers.length; i++) {
ScriptApp.deleteTrigger(allTriggersi); }
// 実行したい時刻を配列で指定
// 毎日指定した時刻に実行するトリガーを作成
for (var i = 0; i < hoursToRun.length; i++) {
var trigger = ScriptApp.newTrigger('yourFunction') // 実行する関数名を指定
.timeBased()
.everyDays(1) // 毎日実行
.atHour(hoursToRuni) // 配列の要素に指定した時刻に実行 .create();
}
// 土日祝のトリガーを削除
for (var i = 0; i < nonWorkingDays.length; i++) {
var triggersOnDay = ScriptApp.getProjectTriggers().filter(trigger => trigger.getWeekday() === nonWorkingDaysi); for (var j = 0; j < triggersOnDay.length; j++) {
ScriptApp.deleteTrigger(triggersOnDayj); }
}
}
// 実際に実行される関数(適切な処理に置き換えてください)
function yourFunction() {
// ここに実行したい処理を記述
}
とりあえず毎日トリガー取得して既存のは消して新しくTrigger作って土日祝ならそのトリガーを消すという動作をしているのはわかった
毎日実行のところあってる?
createTrigger関数を毎日0~1時にやればいい感じにしたいので多分こうじゃないほうが良いな
これはどこで祝日かどうかを判定しているんだ?
してなくね?
https://gyazo.com/315f587bf888269be75db04ed3966690
ワロタ マンパワーすぎる
これを参考にするのが良さそう なぜかコードブロックで書いてないけど
code:javascript
// 実行したい時刻を配列で指定
//今日の日付を取得
var today = new Date();
// Discordに送信する時報メッセージ
var sendDate = Utilities.formatDate(today, "Asia/Tokyo", "H時");
var str = # ${sendDate}をお知らせします!
//実行する関数名
var funcName = "time"
var discordWebHookURL = "ここにdiscordのwebhookのURLを入れる"
function time()
{
// 投稿するチャット内容と設定
const message = {
"content": str, // チャット本文
"tts": false // ロボットによる読み上げ機能を無効化
}
const param = {
"method": "POST",
"headers": { 'Content-type': "application/json" },
"payload": JSON.stringify(message)
}
UrlFetchApp.fetch(discordWebHookURL, param);
}
//今日が休日(土日、祝日)か判定する関数
function todayIsHoliday()
{
//今日の曜日(0:日曜~6:土曜)を取得
let weekInt = today.getDay();
//祝日を判定するため、日本の祝日を公開しているGoogleカレンダーと接続する
let calendarId = "ja.japanese#holiday@group.v.calendar.google.com";
let calendar = CalendarApp.getCalendarById(calendarId);
//今日にイベントが設定されているか取得
let todayEvents = calendar.getEventsForDay(today);
//イベントがあるまたは日曜日であるまたは土曜日である場合trueを返す
return todayEvents.length != 0 ||weekInt == 0 || 6 == weekInt;
}
//実行した日の特定の時間にトリガーを作る関数
function createTrigger()
{
// 現在のトリガーをすべて取得
var allTriggers = ScriptApp.getProjectTriggers();
//time関数が設定されている既存のトリガーを削除する
for (var i = 0; i < allTriggers.length; i++)
{
if (allTriggersi.getHandlerFunction() == funcName) {
ScriptApp.deleteTrigger(allTriggersi); }
}
//休業日でなければ新しいトリガーを設定する
if(!todayIsHoliday())
{
for (var i = 0; i < hoursToRun.length; i++)
{
let runHour= new Date(
today.getFullYear(),
today.getMonth(),
today.getDate(),
0
);
ScriptApp.newTrigger(funcName).timeBased().at(runHour).create();
}
console.log("トリガーを設定しました!");
}
else{console.log("本日は休業日です!");}
}
最終的にこんな感じになった 多分これで動くような気がする これでcreateTriggerをGASのトリガーで毎日朝5時とかに設定すれば良い
分単位で指定したくなったらどうすればいいかわからんけど 一旦は諦めるか「:」で文字を分割することができれば行けそう?文字列を数字にして~ みたいな わからん 適当言ってる
その他、土日祝じゃなくても職場としての休業日(年末年始がいつからいつまで休みとか)を対応させる方法としてGoogleカレンダーを見る必要がある?
Scrapboxに書いたjavascriptを取得することもできるが、まあ、めんどくさい かなあ セキュリティリスクもあるし
eval(UrlFetchApp.fetch('https://scrapbox.io/api/code/yozba/test/test.js').getContentText());
みたいな感じに書けばimportのかわりにはなる