はじめに
この記事は過去のことについて言及されています!現在の環境で利用できない可能性があります。
参考にされる際は自己の判断の下で行ってください。
過去のことを思い出しながら書いたのでなんか作文みたいになってますがご了承ください。
なぜやろうとおもったか(動機)
[長いので暇な方や長文好きな人だけ読んでいただければ...]
人間って忘れっぽいんですよね。その中で僕は特にダメ。英語表現の授業で週に1度一言日記(当然英語)をまなBOXというwebツールを利用して提出する必要があったのですが、まあみんな忘れること忘れること...当時高3で週に一度のそれは受験で忙しい皆にとって内申点に響くわりに忘れやすいというとても煩わしい問題でした。(まあ俺は大学行ってないけど)プログラムって生活を便利にするとか問題点を解決するのが醍醐味なので何とか解決できないかとおもい作りました。まあ主に自分が一番忘れるのdリマインドしてほしいな的な動機です (長文小説ゴメン)
要件定義 (といいつつただの作文)
1. GoogleSpreadSheetのExcel関数を使ってプログラムしなくても大体何とかなるようにする。ポイントはGAS実行前に関数でExcelごと更新し曜日を無理やり(笑)取得しています。
【サンプル】
2. LINE Notifyのアクセストークンを取得する(ググって♡)
LINE Notifyのサービス終了がアナウンスされました。
LINE Messaging APIとかに適時移行する必要があります。
3. GoogleAppsSriptに2.で取得したトークンをべた貼り(セキュリティ的にはNGなので今ならGAS内のプロパティ的なとこに書きますね...)しかもSpreedSheetのトークンはただのメモとして一切GAS側では参照されてないという。
4.GoogleAppsScriptのcron的なやつで毎日特定の時間にプログラムを実行
5.特定の曜日に合致した場合のみ(締め切り当日の日曜日と前日の土曜日)にクラスグループへ送信する。
GoogleSpreedSheet(グーグルスプレッドシート)
こちらに当時作ったスプレッドシートがあります。
(当時の)アピールポイントはプログラム(GoogleAppsScript)をチマチマ作るのが面倒なので日付取得・日付表示・日付判定・日付判定の結果を表示、というところまでスプレッドシート上で行っている点です。
今ならプログラムで取得して配列とかに突っ込んどけよって言いたくなります...。
スプレッドシートはExcelと重なる関数が存在するのでそれを最大限に活用しました
(当時あまりExcelと互換性がなかったのでちょっと面倒でした)
GoogleAppsScript(GAS)
この段落の下に当時作ったプログラムがあります。(折りたたんどきます)
毎日1回(夕方ぐらい)GASのcron的なやつでプログラムを自動実行されるように設定します。
流れとして、プログラムを実行したら、紐づけたスプレッドシートにアクセスして更新を行う(この時になんか関数で日付関係が更新されます)
スプレッドシートの特定のセルの値が【締め切り前日】または【締め切り当日】を示す値であれば(if文で判定)
LINE Notifyのアクセストークンを利用してクラスグループにLINEメッセージを送信する。
コード(見たかったら開いてな)
function lineNotifyPost(msg) {
var accessToken='■■ここに自分のクラスグループ用AccessToken■■';//アクセストークン「自分のクラス用」
//var accessToken='AVbHKgeP1Rk1DqeHbkWOzMH1H5lJgeqdlFr5NBp9e8c';//アクセストークン「1:1用」(デバッグ用)
var api_url = 'https://notify-api.line.me/api/notify';//なんかおくるURLらしい。エンドポイントってやつ?(よくわかってないw)
var img_url = '■■ここに送信策URL■■';
var message = msg;
var options = {
'method' : 'post',
'headers': {
'Authorization': 'Bearer ' + accessToken
},
'payload' : {
"message" :message
}
};
var response = UrlFetchApp.fetch(api_url,options);
Logger.log("メッセージ「"+message+"」を送信しました\n"+"レスポンスは「"+response+"」です。");
}
//明日がまなBOXの締め切りかを調べる
function tomorrow_end(){//トリガーで自動実行
Logger.log("tomorrow_end関数の実行を開始します。");
var now=onOpen();//本来、起動時に実行される関数を実行し、シートを更新(現在時刻が戻り値として返却される)。
var spreadsheet=SpreadsheetApp.getActiveSpreadsheet();
var sheet=spreadsheet.getSheetByName('シート');
var str=sheet.getRange('D13').getValue();
var t_day=sheet.getRange('I6').getValue();
var plus=t_day+1;
var debug="True-Saturday";//debug用「アクセストークン1:1にすること!」
if(str=='True-Saturday'){
//↓年度末用
//var message='《祝》\nまなBOXはもう「終わり」です。\nもう入力しなくてOK!\n(通知はそのうち解除します…)';
var message='\n----------------\n《締切の1日前です!》\n(自動通知システム)\n----------------\n[まなBOX]への入力期限は「'+plus+'日(明日)」までです!\n(詳細画像が送信できない為、不明な点が存在しましたらサポートするのでメッセ送ってね♪)\n\nお忘れではないですか?\n(明日の夜分にもう一度だけ通知されます…)\n\n<Server Time>\n'+now+'\n----------------\n【お知らせ】\n冬休みですが日記はまだ入力する必要があります';
Logger.log("tomorrow_end関数の実行を終了しました。");
lineNotifyPost(message);
}
}
//今日がまなBOXの締め切りかを調べる
function today_end(){//トリガーで自動実行
Logger.log("tomorrow_end関数の実行を開始します。");
var now=onOpen();//本来、起動時に実行される関数を実行し、シートを更新(現在時刻が戻り値として返却される)。
var spreadsheet=SpreadsheetApp.getActiveSpreadsheet();
var sheet=spreadsheet.getSheetByName('シート');
var str=sheet.getRange('D14').getValue();
var debug="True-Sunday";//debug用「アクセストークン1:1にすること!」
if(str=='True-Sunday'){
var message='\n----------------\n《本日が締切です!》\n(自動通知システム)\n----------------\n[まなBOX]に日記を入力する期限は本日の深夜までとなります!\n\nもう入力されましたか?\n(最終の通知です…)\n\n<Server Time>\n'+now+'\n----------------\n【お知らせ】\n冬休みですが日記はまだ入力する必要があります';
//var message='\n《祝》\nまなBOXはもう「終わり」です。\nもう入力しなくてOKです!\n当botの運用は終了いたしました。Thank You!';
Logger.log("today_end関数の実行を終了しました。");
lineNotifyPost(message);
}
}
function onOpen(){//onOpen関数はスプレッドシートのOPEN時に自動的に読み込まれるほか、○○_end関数の実行時にも実行される(手動実行)。
Logger.log("onOpen関数の実行を開始します。");
var spreadsheet=SpreadsheetApp.getActiveSpreadsheet();
var sheet=spreadsheet.getSheetByName('シート');
var now_time=Utilities.formatDate(new Date(),'Asia/Tokyo','yyyy/MM/dd HH:mm:ss');
sheet.getRange('E2').setValue(now_time);
Logger.log("onOpen関数の実行を終了し、シートに現在時刻["+now_time+"]を書き込みました。");
//↓Debug用
//Browser.msgBox("スプレッドシートが開かれたため、onOpen関数が実行されました。\n時刻が更新されているかを確認してください。\n(手動で実行された可能性もあります。)");
return now_time;
}
おわりに(作文なので読まなくても...)
帰宅部で暇やったので常日頃から時間割まとめてLINEのアルバムにぶち込んだり、落とし物処理したりプリント配ったりしてた(便利屋ポジション)
そのおかげでスクールカーストのピラミッドの下(帰宅部などの底辺)から外部のシードみたいなところの立ち位置(用務員的な)で学校生活を過ごせて中学の時のようにちょっかい出されなかったところはとても良かったです。
あと結構、このプログラムも評判でとてもうれしかったです。
プログラム歴長い人が昔のコード恥ずかしいって言ってた気持ちが少しわかりました。
当時はサンプルプログラムのコピペが主だったので「'」が多いですが、指の入力しやすさ的に今は「”」派です( ´∀` )