見出し画像

ノンプロ研中級講座【GASコース】 Utility Services1  その2

前回のnote


宿題★演習4-05 補足

function myFunction4_05_2(e) {
 // const range = e.range; // 編集したセル
 const oldvalue = e.oldValue; // 前回の値
 const user  = e.user;

 const lastModifiedDate= new Date(); // 最終更新日時
 const strlastModifiedDate = Utilities.formatDate(lastModifiedDate, "Asia/Tokyo", "yyyy/MM/dd HH:mm:ss");// 最終更新日時 書式変換


 let msg = '';
 msg += `最終更新日時: ${strlastModifiedDate}\n\n`;
 msg += `編集前のセルの値: ${oldvalue}\n\n`;
 msg += `編集したユーザ: ${user}`;

 e.range.setNote(msg); // メモとしてmsgを残す
}

e.range.setNote(msg); のようにすると、だめだ。うーん。
いちいちconstしないで直接書いてもいいかな。


講座の続き。

つづき。
動画44:45あたりから

演習4-06/4-07 インストーラブルトリガーの設置と削除

省略

newTrigger


deleteTrigger

★宿題 演習4-08

「肉の日です!」とスプレッドシートの任意のセルに入力する関数を作ります。

そして、その関数が日付に「2」と「9」の数字が含まれる日にのみ、午前10時かっきりに実行されるように、トリガーの設置をするスクリプトも作成してください。

またスプレッドシートへの入力完了後に、トリガーの削除も忘れずにしましょう。

おおう。いろいろ やらなきゃ いけないことが あるぞ。
ミニマムにして考えよう、まずは「肉の日です!」を任意のセルに入力する関数だ。

草案1

// 「肉の日です!」とスプレッドシートの任意のセルに入力する関数
 SpreadsheetApp.getActiveSheet().getRange('A1').setValue('肉の日です!');
画像1

うん、で、次だ。「その関数が日付に「2」と「9」の数字が含まれる日にのみ、午前10時かっきりに実行されるように、トリガーの設置をするスクリプトも作成」

うーん演習を利用すると、大枠はこう?

草案2

// 「肉の日です!」とスプレッドシートの任意のセルに入力する関数
function setMeatDay() {
 SpreadsheetApp.getActiveSheet().getRange('A1').setValue('肉の日です!');
}


// setMeatDay関数が日付に「2」と「9」の数字が含まれる日にのみ、午前10時かっきりに実行されるように、トリガーの設置をするスクリプト
function setTriger() {
 const setDay = //日付に「2」と「9」の数字が含まれる日 //このへんどう書く?
 const setTime = //午前10時 //このへんどう書く?
 const functionName = 'setMeatDay';
 setTime.setMinutes(setTime.getMinutes()); //このへんどう書く?
 ScriptApp.newTrigger(functionName).timeBased().at(setTime).create();//このへんどう書く?
}

うーん、どうやって書いていくんだ。まず、日付に「2」と「9」の数字が含まれる日をどうにかしたい。if,match,includeあたりか?

includeじゃなくてincludes 、sがついてた。

その日が2or9を含んでいたら、処理に進む、という考え方でよいかなあ。

まてよ、毎日このスクリプトが動くとして、10時に発動するならそれより前の時間に今日が肉の日かどうかを判定しないといけないよね?

8~9時 その日が肉の日かどうか判定。肉の日でなければ沈黙、肉の日ならトリガー設置
10時 トリガー起動、肉の日です!のメッセージが出力される。
その後(とりあえず11時でいいいか)トリガー削除

こういう流れになる、ってことでよい?

あ~で、どうする?

なんだか、同期の中では三項演算子が流行っているみたいだが、よくわからん。

草案3

 const today = new Date();
 const dateString = today.getDate().toString();
 
 console.log(today);
 console.log(dateString);
 console.log(typeof today)
 console.log(typeof dateString)
 
 //console.log(today.includes(2));
 
 console.log(dateString.includes(2));
 // expected output: true

日付を取得したあと、includesで判定させるために文字列にする、というので詰まっていた。同期の回答をちらちら見た。

うんうん、そうすると、こうか?

草案4

// 「肉の日です!」とスプレッドシートの任意のセルに入力する関数
function setMeatDay() {
 SpreadsheetApp.getActiveSheet().getRange('A1').setValue('肉の日です!');
}


// 日付に「2」と「9」の数字が含まれる日か判定
function isMeatDay() {
 const today = new Date();
 const dateString = today.getDate().toString();

 if (dateString.includes(2) || dateString.includes(9)) {
   //午前10時かっきりに実行されるように、トリガーの設置をするスクリプト
   setTriger():
 }

 // 午前10時かっきりに実行されるように、トリガーの設置をするスクリプト

 function setTriger() {

 }

 // スプレッドシートへの入力完了後に、トリガーの削除
 function deleteTriger() {

 }

形が見えてきたかな?これで、どうにか書けそうかな?

10時きっかり、をどう書くかで迷た。

setHours みたいだ。

https://developers.google.com/apps-script/reference/jdbc/jdbc-time?hl=en#setHours(Integer)

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/setHours


う~~~~ん、これでいいのかあ??

草案5

// 演習4-08
// 「肉の日です!」とスプレッドシートの任意のセルに入力する関数を作ります。
// そして、その関数が日付に「2」と「9」の数字が含まれる日にのみ、午前10時かっきりに実行されるように、トリガーの設置をするスクリプトも作成してください。
// またスプレッドシートへの入力完了後に、トリガーの削除も忘れずにしましょう。
// 日付に「2」と「9」の数字が含まれる日か判定
//isMeatDay は毎日朝8~9時に実行されるようトリガーセットしておく。
function isMeatDay() {
 const today = new Date();
 const dateString = today.getDate().toString();
 if (dateString.includes(2) || dateString.includes(9)) {
   //午前10時かっきりに実行されるように、トリガーの設置をするスクリプト
   setTriger();
 }
}
// 午前10時かっきりに実行されるように、トリガーの設置をするスクリプト
function setTriger() {
 const setTime = new Date(); //現在時刻
 setTime.setHours(10);
 setTime.setMinutes(0);
 setTime.setSeconds(0);
	
 const functionName = 'setMeatDay';
 ScriptApp.newTrigger(functionName).timeBased().at(setTime).create();
}
// 「肉の日です!」とスプレッドシートの任意のセルに入力する関数
function setMeatDay() {
 SpreadsheetApp.getActiveSheet().getRange('A1').setValue('肉の日です!');
 deleteTriger();
}
// (スプレッドシートへの入力完了後に)トリガーの削除
function deleteTriger() {
 const triggers = ScriptApp.getProjectTriggers();
 const functionName = 'setMeatDay';
 for (const trigger of triggers) {
   if (trigger.getHandlerFunction() === functionName) {
     ScriptApp.deleteTrigger(trigger);
   }
 }
}

続く。








いただいたサポートで、書籍代や勉強費用にしたり、美味しいもの食べたりします!