気象庁から提供されている2週間気温予報のデータを視覚的に一目で把握できるようにするため、スプレッドシートでグラフ化 → 画像メッセージとして LINE で配信する GAS(Google Apps Script)を作ってみました。
▼ スプレッドシートの準備
2週間気温予報のデータの入力、及びグラフ作成のためのスプレッドシートを準備します。
グラフの見出し用にB1からM1に順に「平均気温(予報)」「最高気温(予報)」「最低気温(予報)」「平均気温(平年値)」「最高気温(平年値)」「最低気温(平年値)」「平均気温(過去10年)」「最高気温(過去10年)」「最低気温(過去10年)」「平均気温(昨年)」「最高気温(昨年)」「最低気温(昨年)」と入力しておきます。
予報、平年値、過去10年、昨年についてそれぞれ平均気温、最高気温、最低気温なので計12列になります。
▼ スクリプトの作成
まずは2週間気温予報のデータの取得、グラフの作成・保存、LINEへのグラフ画像URLの受け渡し、グラフの削除(ゴミ箱移動)を行うためのスクリプトです。
今回はとりあえず予報についてのみ簡単な折れ線グラフを作成、配信するようになっています。
2週間気温予報のデータの取得には自作の Web API を利用しています。
function getTwoweekData() {
const spreadsheet = SpreadsheetApp.openById("スプレッドシート ID");
const twSheet = spreadsheet.getSheetByName("twoweek");
//JSON データの取得
let point = "地域(地点)番号";
let url = "https://api.cultivationdata.net/twoweek?point=";
url = url + point;
let response = "";
try {
response = UrlFetchApp.fetch(url);
} catch(e) {
return response;
}
let data = JSON.parse(response.getContentText());
//スプレッドシートに初期日と予報期間を入力
let date = new Date([data["date"][0]]);
let fcDate = new Date(date.setDate(date.getDate() + 2));
let period = [];
for(i = 0; i < 13; i++) {
period.push([Utilities.formatDate(fcDate, "JST", "MM/dd")]);
fcDate = new Date(fcDate.setDate(fcDate.getDate() + 1));
}
twSheet.getRange(2, 1, 13, 1).setValues(period);
//スプレッドシートに気温を入力
let keys = Object.keys(data);
let twoweek = [];
let temp = [];
for(let x = 0; x < 13; x++) {
for(let y = 1; y < 5; y++) {
temp.push([data[keys[y]]["ave" + String(x)][0]]);
temp.push([data[keys[y]]["hi" + String(x)][0]]);
temp.push([data[keys[y]]["low" + String(x)][0]]);
}
twoweek.push(temp);
temp = [];
}
twSheet.getRange(2, 2, 13, 12).setValues(twoweek);
//折れ線グラフを作成
const range = twSheet.getRange(1, 1, 14, 4);
let chart = twSheet.newChart()
.addRange(range)
.asLineChart()
.setNumHeaders(1)
.setPosition(16,2,0,0)
.setOption("title", "2週間気温予報")
.build();
twSheet.insertChart(chart);
//折れ線グラフをドライブに保存
let graph = twSheet.getCharts();
let graphImg = graph[0].getBlob();
let folder = DriveApp.getFolderById("フォルダ ID");
let file = folder.createFile(graphImg.setName("graph"));
file.setSharing(DriveApp.Access.ANYONE, DriveApp.Permission.VIEW);
//LINE 配信
push(file.getDownloadUrl());
//折れ線グラフの削除
twSheet.removeChart(graph[0]);
folder.getFilesByName("graph").next().setTrashed(true);
}※ Web API の URL(7行目)が変更になりました。
2行目の「スプレッドシート ID」、6行目の「地域(地点)番号」、56行目の「フォルダ ID」を記載します。フォルダはグラフ画像を一時的に保存する場所になります(LINE 配信後にゴミ箱に入ります)。
また、シート名は「twoweek」、作成するグラフ名は「graph」としています(適宜変更してください)。
つぎに LINE で画像メッセージをプッシュ通知で配信するためのスクリプトです。
const ACCESS_TOKEN = "チャンネルアクセストークン";
const PUSH = "https://api.line.me/v2/bot/message/push";
function push(img) {
let postData = {
"to" : "LINE ユーザー ID",
"messages" : [
{
"type" : "image",
"originalContentUrl" : img,
"previewImageUrl" : img
}
]
};
// リクエストヘッダ
const headers = {
"Content-Type" : "application/json; charset=UTF-8",
"Authorization" : "Bearer " + ACCESS_TOKEN
};
// POSTオプション作成
const options = {
"method" : "POST",
"headers" : headers,
"payload" : JSON.stringify(postData)
};
return UrlFetchApp.fetch(PUSH, options);
}
1行目の「チャンネルアクセストークン」、7行目の「LINE ユーザー ID」を記載します。
LINE のユーザー ID は LINE ID とは異なります。不明な場合はこちら↓を参考に取得してください。
ということで、ひとまず完成です。
getTwoweekData 関数を実行することで、こんな感じで画像メッセージが配信されます。
今日とても寒いですが、一応今後上がっていく予報ですね。よかった……。
あとは、平年値との差なんかも分かるようにしたいですね。
トリガー設定をして、毎朝送られてくるようにしようかと思います。
***
LINE で画像メッセージをおくるためには JPG もしくは PNG ファイルの URL を指定しなければならないのですが、Google ドライブ内の画像ファイルから LINE で送信可能な URL をどう取得すればいいの分からず迷宮に入り込みました。
getUrl() ではだめ。結局、getDownloadUrl() でいけました。取得できる URL は JPG や PNG の拡張子付きではないのですが、なぜか大丈夫です。
自動でグラフ化からの画像メッセージはけっこう便利そうなので、覚えておくといろいろ使いどころがありそうです。
![詳解! Google Apps Script完全入門 [第3版]](https://m.media-amazon.com/images/I/51FYffSOBcS._SL160_.jpg)
詳解! Google Apps Script完全入門 [第3版]
by SimpleImageLink
・関連投稿
【GAS】気象庁 API から取得した天気予報を LINE にプッシュ通知する
2週間気温予報のデータを JSON 形式で取得する Web API を作りました。
