質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

2回答

2349閲覧

GASをトリガーで年に1度動かしたいです

shopp_life

総合スコア3

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2023/02/10 15:01

GASのトリガーを年に一度動かしたい

スクリプトを年に一度,特定の日に動くようにしたいです。
下記のコードで,「1月」シート内のデータを「集計」のシートに転記されるようにしています。
2月のシート,3月のシート・・・・とそれぞれあるのですが,トリガーを設定してそれぞれの月のデータを翌月の5日0時に自動転記されるようにしたいと思っています。

例えば,
「1月」シートのデータは,2月5日の0:00時に転記。
「2月」シートのデータは,3月5日の0:00時に転記。

ただ,トリガーの設定で「イベントソース>時間主導型」で「時間ベースのトリガーのタイプを選択」が「月ベースのタイマー」までしかなく,年ベースで設定できません....

年に一回,特定月の5日に動かす方法はあるのでしょうか?(時間は何時でも大丈夫です)
初心者なもので,説明が下手で申し訳ありません。コードもぐちゃぐちゃかもしれません....

ご教授いただけたらと思います。どうぞ宜しくお願いいたします。

該当のソースコード

function january() { let sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("1月") let sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("集計") let lastRow = sheet2.getRange(2, 3).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); sheet1.getRange(1, 9, 5).copyTo(sheet2.getRange(lastRow+1, 3),SpreadsheetApp.CopyPasteType.PASTE_VALUES, true) sheet1.getRange(1, 11, 5).copyTo(sheet2.getRange(lastRow+1, 8),SpreadsheetApp.CopyPasteType.PASTE_VALUES, true) }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

例えば下記のトリガー時に動かしたい関数がある場合

GAS

1function TriggerStart { 2 3}

GAS

1let time = new Date(); // トリガーを動作させたい日時を設定する 2ScriptApp.newTrigger('TriggerStart').timeBased().at(time).create();

とすれば任意の日時でトリガーを作成できます。

このトリガーは1回しか動作しないので、動作したタイミングで自分で消してやる必要があります。
ScriptApp.getProjectTriggersにて設定されているトリガーを取得し、ScriptApp.deleteTriggerでトリガーを消すという形になります。

GAS

1 const triggers = ScriptApp.getProjectTriggers(); 2 //トリガー登録のforループを実行 3 for(let i=0;i<triggers.length;i++){ 4 //取得したトリガーの関数がTriggerStartの場合、deleteTriggerで削除 5 if(triggers[i].getHandlerFunction()==='TriggerStart'){ 6 ScriptApp.deleteTrigger(triggers[i]); 7 } 8 }

最終的には

GAS

1function TriggerStart { 2 // 動作したトリガーを消す 3 4 // 次回に動作するトリガーを作成する 5 6 // 本来動作させる処理 7}

といった感じで処理することとなります。

詳しくは下記を参照してください。
Class ScriptApp
getProjectTriggers()
deleteTrigger(trigger)
newTrigger(functionName)
Class TriggerBuilder


追記

毎月5日にトリガー動作させたほうがよろしいかとは思います。

GAS

1 2 //本日の日付を取得 3 const today = new Date(); 4 const year = today.getFullYear(); //年 5 const month = today.getMonth()+1; //月 6

とすれば年、月は取得できますのでそれを利用して処理内で分岐するのがいいでしょう。

投稿2023/02/10 22:31

編集2023/02/11 00:53
YAmaGNZ

総合スコア10555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

月ベースがあるなら、それで動かして、そのコードで、動かす年月日の判断して動かせるようにしましょう

投稿2023/02/10 15:43

y_waiwai

総合スコア88163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問