こんばんは。
先日、以下の記事を投稿しました。
「天気情報を取得すると同時にスプレッドシートに同時に記録する事で天気の傾向が見れるのでは」といったコメントを書きました。
実装が面倒だろうな・・と思ってお茶を濁した記載をしたのですが、やってみたら意外と簡単でした!
今回のお天気APIでいうと、そこまで実利はなかったのですが、LINEとスプレッドシートの連携は、いろいろなところで応用ができると思います。
1.前提
以下の2記事が前提となります。
2.作ったもの
と、同時に
天気、最低気温、最高気温がスプレッドシートに記録されました。
(一番下の行です)
3.作成したプログラム
※不明のエラーで、一部のソースが青くなっています。
var CHANNEL_ACCESS_TOKEN = 'A5vQfV1CrzcbCc9s5Qbl68ndy1VEER7zl3E2n9UNY3gGl6WfznJvf93UbNS+/NfdzvdiXb2a9VPuh5juQHqRMggT0XNfEuk0zogSeSWiDgGIj/q81ls+/LYSzEkbmJ6hhOlrnap+gXV8rHHVSbLQ/wdB04t89/1O/w1cDnyilFU='; // Channel_access_tokenを登録
function yahoo(datarui) {
var url = 'https://yahoo.co.jp/'
//var html = UrlFetchApp.fetch('https://yahoo.co.jp/').getContentText();
var html = UrlFetchApp.fetch(url).getContentText();
var parser = Parser.data(html);
var data = Parser.data(html).from('<h1 class="_3cl937Zpn1ce8mDKd5kp7u"><span class="fQMqQTGJTbIMxjQwZA2zk_3tGRl6x9iIWRiFTkKl3kcR">').to('</span>').iterate();
var datarui = url;
for(let i = 0; i <= 7; i++) {
datarui = datarui + '\n' + data[i];
}
return datarui;
}
// お天気API追加 from
function tenki() {
// お天気API追加2 from
//xxxxxにはスプレッドシートのidを設定
var spreadsheet = SpreadsheetApp.openById('xxxxxxxxxxxxxxxxx');
var sheet = spreadsheet.getSheetByName('記録');
// お天気API追加2 to
var url = 'http://api.openweathermap.org/data/2.5/weather?q=saitama,jp&units=metric&lang=ja&mode=json&appid=4a0b6182a7f60cbacb774378b7be2db9';
var res = UrlFetchApp.fetch(url);
var id = JSON.parse(res.getContentText()).weather[0].id;
var des = JSON.parse(res.getContentText()).weather[0].description;
var tmin = JSON.parse(res.getContentText()).main.temp_min;
var tmax = JSON.parse(res.getContentText()).main.temp_max;
var datarui = '天気:' + des;
var datarui = datarui + '\n' + '最低:' + tmin;
var datarui = datarui + '\n' + '最高:' + tmax;
// お天気API追加2 from
for(var i=1;i<100000;i++){
var data = sheet.getRange(i,1).getValue();
if(data===''){
j = i;
i = 100001;
}else{
}
}
var d = new Date();
var h = d.getHours();
var min = d.getMinutes();
sheet.getRange(j, 1).setValue(d);
sheet.getRange(j, 2).setValue((h+13)+':'+min);
sheet.getRange(j, 3).setValue(des);
sheet.getRange(j, 4).setValue(tmin);
sheet.getRange(j, 5).setValue(tmax);
// お天気API追加2 to
return datarui;
}
// お天気API追加 to
function doPost(e) {
var event = JSON.parse(e.postData.contents).events[0];
var replyToken= event.replyToken;
if (typeof replyToken === 'undefined') {
return; // エラー処理
}
var userId = event.source.userId;
var nickname = getUserProfile(userId);
if(event.type == 'follow') {
// ユーザーにbotがフォローされた場合に起きる処理
}
var dataruid = '';
dataruid = yahoo(dataruid);
if(event.type == 'message') {
var userMessage = event.message.text;
var replyMessage = userMessage
var replyMessage2 = '';
switch (true) {
case userMessage === 'ヤフー':
dataruid = yahoo(dataruid);
break
// お天気API追加 from
case userMessage === '天気':
dataruid = tenki(dataruid);
break
// お天気API追加 to
default:
dataruid = 'こんにちは!!';
break
}
replyMessage2 = dataruid;
var url = 'https://api.line.me/v2/bot/message/reply';
UrlFetchApp.fetch(url, {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
},
'method': 'post',
'payload': JSON.stringify({
'replyToken': replyToken,
'messages': [{
'type': 'text',
'text': replyMessage2,
}],
}),
});
return ContentService.createTextOutput(
JSON.stringify({'content': 'post ok'})
).setMimeType(ContentService.MimeType.JSON);
}
}
// profileを取得してくる関数
function getUserProfile(userId){
var url = 'https://api.line.me/v2/bot/profile/' + userId;
var userProfile = UrlFetchApp.fetch(url,{
'headers': {
'Authorization' : 'Bearer ' + CHANNEL_ACCESS_TOKEN,
},
})
return JSON.parse(userProfile).displayName;
}
以上です。
4.手順詳細
(1).スプレッドシートのIDを取得する。
連携したいスプレッドシートを作成します。
IDを取る必要があります。
URLの上記赤枠の部分をコピペしてください。
URLの中の、d/xxxxxxxxxxxxx/edit
のxxx~の部分です。
ソースの中で、以下のように定義していきます。
2行目はシート名。こちらも忘れずに。
var spreadsheet = SpreadsheetApp.openById('xxxxxxxxxxxxxxxxx');
var sheet = spreadsheet.getSheetByName('記録');
(2).GASでプログラミングする。
あとは、GASでスプレッドシートを操作する手順で連携できます。
こちらに載せたソースでいうと、、
以下はあまり良いソースではありませんが、空行を特定します。
for(var i=1;i<100000;i++){
var data = sheet.getRange(i,1).getValue();
if(data===""){
j = i;
i = 100001;
}else{
}
}
年月日、日時を取得し、それをスプレッドシートに書き出します。
var d = new Date();
var h = d.getHours();
var min = d.getMinutes();
sheet.getRange(j, 1).setValue(d);
sheet.getRange(j, 2).setValue((h+13)+":"+min);
sheet.getRange(j, 3).setValue(des);
sheet.getRange(j, 4).setValue(tmin);
sheet.getRange(j, 5).setValue(tmax);
制約
①「(h+13)」の部分ですが、プログラムによっては不要なのですが、今回使用したプログラムでは、なぜか実際の時刻-13で表示されました。
良く他のシステムで使われる標準時刻は-9だし、原因不明になっていますが暫定措置として13を加算しています(あまり良いロジックではないため、コピーする場合は適宜調整をしていただければと思います)。
②時刻の分が0~9のとき、1桁で表示されます。
2桁にする処理を調べてみましたが、今の状態でソースを掲載しています。
(3).デプロイする
前の記事を参考に、デプロイします。
4.さいごに
これを使って遊ぼうと思ったのですが、LINEで天気を調べるのは不定期なので、あまり良い感じのデータが集まらないですね・・。
という事で、天気情報から1日3回定期的にGASを実行してスプレッドシートに書き出す方が、粒のそろったデータが取れて良いと思ったので、いずれそちらを実装したいと思います。
スプレッドシート連携機能を使って作りたいものがあるので、また後日ここに載せたいと思います。
ではまた。