#概要
すでにあるシステムやプログラム内で、ユーザーが作ったタスクを、その期限の前日の特定の時間にまとめてLINEに通知する方法です。
- Googleスプレッドシート・・・Googleが作った無料で使えるエクセルみたいなやつ
- Google Script・・・上のスプレッドシートの操作をプログラミングでできるやつ。定期実行(毎日○時に実行とか)できる。無料!
- LINE notify API・・・簡単にLINEに通知を飛ばせるやつ
を使います。
#大まかな方法
0. あるシステムでユーザによってタスクが生成される
- それを、URLの一部分に"タスク期限"と"タスク内容"に分けて組み込んで、Google Scriptに送信
- 送られてきたURLから"タスク期限"と"タスク内容"を取得し、Googleスプレッドシートにメモする
- 毎日21時にGoogle Scriptが自動実行され、Googleスプレッドシートにメモされているタスクを確認
- もし、明日期限を迎えるタスクがあったら、LINEに送信
これでタイトルのような動作ができます。
#詳しい方法
###LINE notify APIを使う準備
こちらのかたの
[スマフォで作業] 設定したルームに「LINE notify」 を招待する
までを行って、APIのアクセストークンを入手する。
###Googleスプレッドシートを作成する
自分のアカウントでGoogleドライブを開き、赤丸のところから、スプレッドシートをクリック。
スプレッドシートの名前は好きなようにつけてOK。
###Google Scriptを作成する
上のツール->スクリプトエディタをクリック。
これも名前は好きなようにつけてOK。
###プログラムを書く
URL経由で飛ばされてきたタスクをスプレッドシートにメモするプログラム
と
全てのタスクを調べ、明日期限のものを発見し、LINEに飛ばすプログラム
を書きます。
function myFunction() {
}
を消して、下のやつをまるっとコピペすればいいはずです。
できるかぎり、説明をつけたつもりです...動くと思います...
//【やること】設定しなきゃいけない変数
var line_api_token = "?????????????????";//LINEのAPI使うときに発行したトークン
//★飛ばされてきたタスクをスプレッドシートにメモするプログラム
//function doGet(e)はURL(タスク情報を含んだ)からアクセスが来た時、自動的に実行されます。
function doGet(e) {
//URLに書かれた期限と内容の情報をGET
var deadline = e.parameter.deadline;
var contents = e.parameter.contents;
//スプレッドシートへのメモ
var sheet = SpreadsheetApp.getActiveSheet();//スプレッドシートを操作できるようにする
sheet.insertRowBefore(1);//一番上に行を新規に挿入
sheet.getRange('A1').setValue(deadline);//1行目A列に期限を設定
sheet.getRange('B1').setValue(contents);//1行目B列にタスク内容を設定
}
//★全てのタスクを調べ、明日期限のものを発見し、LINEに飛ばすプログラム
//function myFunction()は、設定後、特定の日時に自動的に実行されます。
function myFunction() {
var sheet = SpreadsheetApp.getActiveSheet();//スプレッドシートを操作できるようにする
var last_row = sheet.getLastRow();//スプレッドシートに書き込みがある最終行を調べる
//上から最後に書き込みがある行まで1行ずつ調べるためのforループ
for(var i = 1; i <= last_row; i++) {
var target_deadline = new Date(sheet.getRange('A' + i).getValue());//i行目のタスクの日付をGET
var tommorow = new Date();tommorow.setDate(tommorow.getDate() + 1);//明日の日付を生成
//もし、タスクの日付が、明日の日付と、年も月も日にちも同じだったら、明日のタスクだ!と判定
if(tommorow.getYear() == target_deadline.getYear() && tommorow.getMonth() == target_deadline.getMonth() && tommorow.getDate() == target_deadline.getDate()) {
//まず、タスクの内容をGET
var target_contens = sheet.getRange('B' + i).getValue();
//次に、LINEに送りつけるために、データの塊を作る
var options =
{
"method" : "post",
"headers" : {'Authorization': "Bearer " + line_api_token},
"payload" : {"message" : target_contens}
};
UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);//LINEに送信
//最後に送信したタスクを行ごと全て削除する
sheet.deleteRow(i);
i--;//行を削除すると今見てる行が次の行になるからiを1減らす
last_row--;//行を削除すると最終行も最初と比べて1行減るから、減らす
}
//もし、明日のタスクじゃなかったら、次の行を調べにいく
}
//最終行まで確認し終わったら、その日の動作は終わり!
}
###プログラムを自分用に改変する
上のプログラムの1行目、
【やること】設定しなきゃいけない変数
の???????の部分を最初に取得したLINEアクセストークンに置き換えることで、自分のLINEアカウントにタスクが飛んできます。
例) "????????" -> "ELSUEGXSUEYW"
###Google Scriptを定期実行させる設定にする
上のプログラムのmyFunction()を好きな時間に定期実行させます。
上の編集->現在のプロジェクトのトリガーをクリック。
右下のトリガーを追加をクリック後、以下のように設定。※21時通知希望の場合
###外のシステムからタスクを受ける窓口を作る
上の公開->ウェブアプリケーションとして導入
以下のように設定後、表示されてるURLをメモっておく。
以上でGoogle Scriptの設定は終了です!
###スプレッドシートの行を1行残して削除する
上のプログラムでは、新規タスクに対して1行増やし、LINEに送信したら1行消すので、他の行は必要ありません。
###動作確認をする
1動作許可をする
赤丸のところが"myFunction"になっていることを確認して、青丸を押してください。
初めて動かすときだけ、なんか、許可を求められます。赤丸を押し、自分のアカウントを選択するなどして、全部許可にします。
2次に、タスクをこのシステムに送信してみます。
先ほどメモしたURLの後ろに
"?deadline=YYYY/MM/DD HH:MM:SS&contents=見本ブロックを作る"
を追加します。
deadline=YYYY/MM/DD HH:MM:SS
でタスクの期限を表現していて、
contents=見本ブロックを作る
でタスクの内容を表現しています。
★YYYY...には明日の日付と適当な時間を入れてください。★
URLの完全な例)
- https://script.google.com/macros/s/AFEDA・・・・人それぞれ違う・・・Hc0/exec?deadline=2020/01/16 16:20:00&contents=見本ブロックを作る
★"作る"までがURLです。日付と時間の間の半角スペースを忘れずに。
3作成したURLにブラウザでアクセスしてみる
この操作が、システムへのタスク送信作業になります。
が正しい状態です。
4スプレッドシートを開いて、タスクがメモされているか確認する。
が正しい状態です。※日付はそれぞれ。
5手動でLINEに送ってみる
本来は、21時に自動実行されて、自動的にLINEに送られるはずですが、今回は動作確認のため、手動でプログラムを実行し、LINEに送ってみます。
赤丸のところが"myFunction"になっていることを確認して、青丸を押してください。
6LINEにとどく
プログラムが動き出し、明日期限のタスクがスプレッドシートにあったら、LINEに通知してくれるはずです。
###自分の環境に合うようにする
以上の流れを行えば、希望の時間に翌日のタスクを全部LINEに通知できるはずです。
あとは、自分が制作しているプログラムで、ユーザーがタスクを作った時にURLに情報を含ませて読み込めばOKです。
以下はPython3のプログラムから、タスクを追加する例です。
requestsモジュールのインストールが必要かもしれません。
# Python3のコード
import requests
url = 'https://script.google.com/macros/s/AKfycbzmK・・・それぞれ違う・・・1yHc0/exec?deadline=2020/01/17%2016:20:00&contents=見本のブロックを作る'
requests.get(url)