LoginSignup
4
8

More than 3 years have passed since last update.

【GAS、LINE API】LINEで受け取った情報をスプレッドシートに書き込む

Last updated at Posted at 2021-03-30

こんばんは。

先日、以下の記事を投稿しました。

「天気情報を取得すると同時にスプレッドシートに同時に記録する事で天気の傾向が見れるのでは」といったコメントを書きました。
実装が面倒だろうな・・と思ってお茶を濁した記載をしたのですが、やってみたら意外と簡単でした!
今回のお天気APIでいうと、そこまで実利はなかったのですが、LINEとスプレッドシートの連携は、いろいろなところで応用ができると思います。

1.前提

以下の2記事が前提となります。

2.作ったもの

image.png

と、同時に

image.png

天気、最低気温、最高気温がスプレッドシートに記録されました。
(一番下の行です)

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を取る必要があります。

image.png

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を実行してスプレッドシートに書き出す方が、粒のそろったデータが取れて良いと思ったので、いずれそちらを実装したいと思います。

スプレッドシート連携機能を使って作りたいものがあるので、また後日ここに載せたいと思います。

ではまた。

4
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8