GASを利用して作ったWebサービス(アプリ)まとめ
はじめに
後藤銃士です。作ったWebサービス(アプリ)が少しずつ揃ってきたのでまとめて紹介させて下さい!基本的に、GAS がベースで、ほとんどなろう小説APIを使ったものになってます(汗)。得意&好きなものなんだからしょうがないね!
1. なろう小説更新通知bot
2019/02/02 公開した今一押しのWebアプリ。LINEbotです。「なろう小説の更新情報をLINEで受信したい!」というニーズを見越してい作成しました。…嘘です、自分で欲しいと思って作ったサービスです。マジ便利だと思うので、なろう小説読み専かつLINEユーザーには使ってみて欲しいです。今のところ私しか使っていないので寂しいです…(チラッ)。
記事にも書きましたが LINE の Push API の制限上50名までなので、早いもの勝ちですよ、ということは改めてお伝えしておきたいッ。
2. なろう小説コンシェルジュ
2018/12/08 公開のLINEbot。何か入力すると、入力に沿った作品をリコメンドしてくれる LINEbot で現時点で2名の方に使ってもらっています(歓喜!)。こちらは Push API を使っていませんでの制限なしで利用できます。今は単純に入力値に対して検索してくるだけなんですけど、ジャンルを指摘できたり、おすすめした作品の詳細情報を出したりと改修の余地ありかなあと考えています。
また、裏コマンドを使うと大人向け作品も検索してくれたりしますので、検索ワードになにかそれっぽい言葉を一緒にいれるとよろしいかと思います。
3. なろう小説月間ランキングベスト20
2019/01/21 に公開した記事の題材として作りました。なろう小説ランキングAPIを使っています。その月のベスト20作品をリスト化しています。また毎日、最新投稿のリンクを表示し、作品に振られたポイントをグラフ化しています。月をまたぐと自動的に更新されるところがポイントでしょうか。また、普通にランキング上位作品は面白さが担保されているので、自分の楽しみも使え、作ってよかったですね。
4. なろう小説月間ランキングベスト100
2019/02/03 公開しました。ベスト20ではその月の作品しかフォローしていませんでしたが、ランキングAPIは過去2013年5月まで遡れる、ということで遡れるようなサイトを作成しました。アクセスするたびにAPIを叩くのは確定しているデータ故に忍びないので、1回だけスプレッドシートに取り込んだあとは、スプレッドシートデータを元に画面を生成しています。それでも GAS では遅いのですけどね…。これも月をまたぐと自動で更新される実装です。
以上、4つのサービスを GAS を使って無料で行っています。本当に巨人の肩に乗っているなあって実感します。ありがたいですね。またサービスが増えたら更新したいと思います。
「なろう小説更新通知bot」というLINE BOT を作りました
こんにちは、後藤銃士です。ここ数日GASで「なろう小説更新通知bot」を作っていましたがようやく目処が立ったので公開いたしますね。
「なろう小説更新通知bot」とは何よ?
なろう小説ってブックマークした作品がいつ更新されたかを知るのに、わざわざブラウザ開いてログインしないとわからないんですね。そんなん手間やん?出来れば LINE で更新情報が通知されたら便利やん?ということで作りました。
取り急ぎ今回は LINE BOT つくったよー、なろう小説ユーザーは使ってみてねーというお知らせでした。
今回、LINE Messaging API の Push API で通知を実現しているのですが、Push API を使えるプランが「Developer Trial」か「プロ(API)」の2択しかなく、後者だと月32,400円(税込)なので無料の前者を使っております。これ、制限があって追加できる友達数が50人なんですね。
ですから試してみようと思う方は早めに登録されることをオススメします。 使ってみて改善点等ありましたら、Twiiter やブログのコメント欄にお願いいたします。
登録方法
下のQRコードを読むか、「友だち追加」をクリックしてみて下さい。
使い方
※技術的な話はまた次回に。基本はすでに紹介している技術を組合せただけですから、誰でも作れますよ。
なろう小説の更新通知について調べた
はじめに
先日の記事で作ったWebアプリ「なろう小説月間ランキングベスト20」で見つけた「お隣の天使様にいつの間にか駄目人間にされていた件」という激甘青春作品があるのですけど、続きがいつ更新されるか気になって仕方がない日々を過ごしているわけなんですね(40代中盤男性ですけど)。更新があったらすぐにでも読みたい気分でいるわけですよ。
ブラウザでサイトにログインし「更新通知チェック中一覧」ページを開けば更新有り無しはわかるのですけど、FGOも忙しい身としてはわざわざ自分からチェックするのはだるいわけで…。
というわけで、ブラウザにログインせずに更新通知を得ることができないのか調べてみることにしました。
結論
- 公式はブラウザログイン以外の更新通知は行っていない(!)。
- メールによる更新通知なら、なろうAPIを利用した?第三者?サイトが行っている模様。
あとは非公式のなろう小説 iPhone / Android アプリに更新通知機能があったりするらしいんですが、それだけのために入れるのもめんどうですしね…。
対策
個人的に更新通知はLINEで欲しいと思っているので、GASでなろう小説の更新通知するLinebotを作ろうかと思っています(Slackbotでもいいけど)。
その際、実装案が2つありまして、
上の案ですと、本ブログの記事「GASでGmailを検索してLINEで通知する」を使えばすぐにでも実装可能です。ただ通知設定を行うのに「ネット小説更新チェック」の設定を触る必要があるのと、あっちのほうで不具合があった場合はどうしようもない、という問題があります。
なので今回は、下の案で実装してみようかと考えています。LINE上で更新したい作品の登録し、更新があった場合はLINEで通知してくれる、というものを想定しています。うん、自分的にそっちのほうがしっくりくる。というわけで、作っていきます。
開発にむけての技術メモ
Pythonでの実装例
- 2018/09/20 「小説家になろう」で新しく公開された記事のメール通知を自動化【Python】
GAS と LINE Messaging API
2018/12/15 【LINE Botの作り方】Messaging API × GAS(Google Apps Script)でおうむ返しボットを作成する
2018/10/28 LINE Messaging API を Google Apps Script で利用するためのライブラリ作りました
2018/09/17 【2018年 LINE Bot 作り方】GASで支出管理Botを作ってみた
2018/08/14 GASとLINE Messaging APIでpushメッセージのLINEbotを作る!
2018/12/19 GASとLINE Messaging APIで同棲生活を便利にした話
LINE Developers
なろう小説
その他の小説サイトの更新通知
Google Apps Script 講座資料編「GASでスプレッドシートをPDF化する」
はじめに
後藤銃士です。やりたいことがあってもなかなか手が動かない&検証に時間が掛かって記事かけないってことがありますよね。ええ、今の私です。
なので今回は「GASでスプレッドシートをPDF化する」にあたり参考にしている記事リストのみを上げておきます。自分で納得ができたら記事を書きますので。
といいますか、すでに先行してソースや資料を公開されている方が多数いらっしゃいますから、素直にそっちを読んでサクサクと自分の欲しい機能を実装をする、とうのも手かなと思います。今後こんなパターン増えそうな予感。楽だしw
紹介URL
2018/11/25 掲載 Google Apps ScriptでPDFを作成する 🌴 officeの杜
2018/03/05 掲載 GoogleフォームとGASで請求書のPDFを自動生成する - Qiita
2017/02/24 掲載 Google Apps Script でファイルを保存してみる
2016/10/09 掲載 Google Apps Script で指定したシートをPDF化するスクリプト
??? 掲載 PDFを作成したい - Google Apps Maniacs
調べきれていないこと
大抵のサイトは UrlFetchApp.fetch を使って、Googleドライブに保存されているファイルを PDF に変換した状態で取得しているのですけれど、その変換ルールの一次ソースがわからなくてですね…、記事を書くの躊躇しておりまして…。
具体的にはココですね。 GoogleフォームとGASで請求書のPDFを自動生成する - Qiita
//以下PDF化のためのプログラムです。今回はA4サイズでPDF化するため、オプション設定も下記のようになります。 var url = "https://docs.google.com/spreadsheets/d/SSID/export?".replace("SSID", ssid); var opts = { exportFormat: "pdf", format: "pdf", size: "A4", portrait: "true", fitw: "true", sheetnames: "false", printtitle: "false", pagenumbers: "false", gridlines: "false", // 忘れがちですがここをfalseにしないと薄い罫線が入ってしまいます。 fzr: "false", gid: pdfsheetid };
この opts 情報の元ネタがどこにあるのかなあってわからなくてですね。動けばええやんけ、という気もしていますけど(汗)やる気になったら参考URLをみながら紹介記事書くことになるかと思います。
今しばらくお待ち下さい。
Google Apps Script 講座中級編「GASでWebアプリを公開する」
はじめに
後藤銃士です。腰痛、ようやく痛みが引いてきました。
前回、WebAPIでデータを取得してきましたので、そのデータをWebアプリとして公開したいと思います。
ところでWebアプリってなんね?という人いますか。Webアプリって、早い話ブラウザで表現されるアプリケーションってことで(?)広い意味ではブログだって G Suite だって全部当てはまるかなーって思います。単純に HTML を表示することだってWebサーバにアクセスしてデータとってきてますしね…。まああれよ、硬いことはいわねえ、Webブラウザで表示されるやつは丸っとWebアプリってことで。
GAS ってほんとよく出来ていて、簡単にWebアプリを作ることが出来ます。今回のようにWebAPIでデータとってきて結果を表示するとか余裕なんですよね。というわけで早速いきましょう。
この機能が役に立つのは
GAS で Webアプリと通して即結果を求めたい人向け
講座スタート
いつもどおりコピペだけで大丈夫です。が、その前に HTML ファイルを用意してそっちにもコピペします。 HTML は以下の手順で作って下さい。
新規スクリプト作成画面にて、ファイル>新規作成>HTMLファイルを選択します。
で、今回は index.html と入力して OK を押します。
するとこんな画面がでます。
で、今回は以下をコピペして下さい。
<!DOCTYPE html> <html> <head> <base target="_top"> </head> <body> </body> </html> <!DOCTYPE html> <html> <head> <base target="_top"> <title>なろう小説月間ランキングベスト20</title> </head> <body> <a href="https://twitter.com/jijyoron">連絡先:後藤銃士@GASやっていきましょう</a> <h1>なろう小説月間ランキングベスト20</h1> <ol> <? var spreadsheet = SpreadsheetApp.openByUrl('ご自身のスプレッドシート'); var sheet = spreadsheet.getSheetByName('シート1'); var narouInfo = sheet.getDataRange().getValues(); for(var i=0;i<narouInfo.length;i++){ output.append('<li><a href="https://ncode.syosetu.com/' + narouInfo[i][0] + '/">' + narouInfo[i][1] +'</a></li>'); } ?> </ol> </body> </html>
用意が出来ましたか?では、
新しくタブを開き「script.google.com」を入力してコードを書ける状態にして下さい。 あと、データ保存用にスプレッドシートも用意しておいてね。
そして今回は、コード.gs にまるっとコピペして下さい。
function myFunction() { var rankNum = 20; var rankList = ""; var thisMonth = Utilities.formatDate(new Date(), "JST", "yyyyMM01"); var narouInfo = {}; // なろう小説ランキング情報取得(月間) var narouRankingUrl = "https://api.syosetu.com/rank/rankget/?out=json&rtype=" + thisMonth + "-m"; var response = UrlFetchApp.fetch(narouRankingUrl); // var json=JSON.parse(response.getContentText()); for(var i in json){ if (i > rankNum -1){ break; } rankList = rankList + json[i]["ncode"] + '-'; } Logger.log(rankList); rankList = rankList.slice(0, -1); // なろう小説情報取得 var narouUrl = "https://api.syosetu.com/novelapi/api/?out=json&ncode=" + rankList; response = UrlFetchApp.fetch(narouUrl); // var infoJson=JSON.parse(response.getContentText()); for(var i in infoJson){ if (i == 0){ continue; } rankList = rankList + infoJson[i]["ncode"] + '-'; narouInfo[infoJson[i]["ncode"]] = infoJson[i]; } // スプレッドシートに書き込み var spreadsheet = SpreadsheetApp.openByUrl('ご自身のスプレッドシート'); var sheet = spreadsheet.getSheetByName('シート1'); // 並び替え for(var i in json){ if (i > rankNum -1){ break; } var ncode = json[i]["ncode"]; Logger.log(i + ":" + ncode + " " + narouInfo[ncode]['title']); sheet.getRange(Number(i) +1, 1).setValue(ncode); sheet.getRange(Number(i) +1, 2).setValue(narouInfo[ncode]['title']); } } function doGet() { return HtmlService.createTemplateFromFile('index').evaluate(); }
それでは実行してみましょう。 なお、実行する際は、 myFunction を選択して「実行」すること。
まず、スプレッドシートを確認して下さい。 すると、20件のなろう小説情報が保持されています、ね?
ではこれらの情報をWebアプリケーションにするために、公開>ウェブアプリケーションとして導入…を選択します。
で、以下のように設定して更新を押します。すると、
現在のウェブアプリケーションの URL と出ますのでこいつをコピペします。この URL に表示されるというわけです。
ブラウザに入力してみるか、「最新のコード」をクリックします。
するとこんな感じで表示されます。やったね!
例によって myFunction() をトリガーで定期更新しておけば、最新の情報が自動更新されます。 WebAPI だけでなく、スクレイピングによって取得してきたデータをこんな風に定期表示しておくことをしておくと結構便利ですし、Web公開することで共有することも可能となります。
軽く、html 側の説明をしておくと、
<? var spreadsheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1yWEhaJPlmDKs7ltbX-7UpEplnnCSDnmGdTJikjQFG0U/edit#gid=0'); var sheet = spreadsheet.getSheetByName('シート1'); var narouInfo = sheet.getDataRange().getValues(); for(var i=0;i<narouInfo.length;i++){ output.append('<li><a href="https://ncode.syosetu.com/' + narouInfo[i][0] + '/">' + narouInfo[i][1] +'</li>'); } ?>
<? 〜 ?> の間にコードを書きます。ここの中ではプログラムとして認識してくれますので、あとは、いつもようにスプレッドシートを指定後、データを取り出しては、output.append()で、HTMLタグを出力しています。
今回はHTML側にロジックを書いてますが、コード.gs 側にロジックを書いて、その結果を HTML に付与するという方法もあります。
とにかく一旦スプレッドシートにデータを保持しておく、というのがキモですかね。スプレッドシートを経由しなくても毎回 WebAPI を叩いてもいいのですが、もともと参照しているなろうAPI の月間データは1日1回更新らしいので、アクセス毎に WebAPI 叩くのはリソースを喰うだけで勿体ないです。スプレッドシートに書いておけば、Webアプリケーションで表示するときにスプレッドシートをみればよいですものね。
そんな風にあちこちに気を使いながら実装していけるとよいと思いますし、ここまで出来れば大したものですよ。
今回は以上となります。
それでは、ご覧いただきありがとうございました。
Google Apps Script 講座初級編「GASでWebAPIを利用してデータを取得する」
はじめに
後藤銃士です。FGO、「マンガで分かる!FGO」にハマっています。面白いなあ。
今回と次回に渡り、動的なWebアプリケーションを作りたいと思います。以下を予定しています。
今回:WebAPI でデータを取得
次回:上記のデータをWebアプリ化して公開
GAS では html を書いてゴニョゴニョすればサーバ用意しなくても全世界に公開できますのでその機能をつかいつつ、表示する内容は公開されている WebAPI を利用します。
以前は、Google の検索結果や、Twitter、Instagram の URL から欲しい情報を抽出して利用してきましたが、やることは同じです。WebAPI も URL を叩いてデータを取得します。
通常、URL を叩くと帰ってくるのが html 形式ですが、WebAPI の場合 JSON 形式がほとんどです。JSON 形式は詳しくはググっていただくとして、JavaScript と親和性が高いので、データを簡単に扱えるもの、とだけ覚えて帰っていただければよいです。GAS でも JSON をハッシュ化できるのでデータ操作が容易になります(この辺りのお話はある程度プログラムを分かっていないと?かと思いますが、すぐ慣れます)。
なろうAPIを使うよ
今回利用するのは、「なろうデベロッパー」(https://dev.syosetu.com)で公開されている、2つのAPIです。
これを組み合わせてつくっていきます。流れは、
ということをします。2 で取得する際、指定した20件情報の順にデータを出力してくれない関係で、3. の並び替えの操作を行っています。 それでは早速ソースをみていきましょう。
この機能が役に立つのは
GAS で WebAPI を使ってみたい人向け(但しアクセストークンない場合)
講座スタート
いつもどおりコピペだけで大丈夫です。
用意が出来ましたか?では、
新しくタブを開き「script.google.com」を入力してコードを書ける状態にして下さい。
そして今回は、コード.gs にまるっとコピペして下さい。
function myFunction() { var rankNum = 20; var rankList = ""; var thisMonth = Utilities.formatDate(new Date(), "JST", "yyyyMM01"); var narouInfo = {}; // なろう小説ランキング情報取得(月間) var narouRankingUrl = "https://api.syosetu.com/rank/rankget/?out=json&rtype=" + thisMonth + "-m"; var response = UrlFetchApp.fetch(narouRankingUrl); // var json=JSON.parse(response.getContentText()); for(var i in json){ if (i > rankNum -1){ break; } rankList = rankList + json[i]["ncode"] + '-'; } rankList = rankList.slice(0, -1); // なろう小説情報取得 var narouUrl = "https://api.syosetu.com/novelapi/api/?out=json&ncode=" + rankList; response = UrlFetchApp.fetch(narouUrl); // var infoJson=JSON.parse(response.getContentText()); for(var i in infoJson){ if (i == 0){ continue; } rankList = rankList + infoJson[i]["ncode"] + '-'; narouInfo[infoJson[i]["ncode"]] = infoJson[i]; } // 並び替え for(var i in json){ if (i > rankNum -1){ break; } var ncode = json[i]["ncode"]; Logger.log(i + ":" + ncode + " " + narouInfo[ncode]['title']); } }
それでは実行してみて下さい。そしてログをご確認下さい。 ログに20件のなろう小説のタイトルが表示されましたね?
特に難しいことはしていません。2回、APIを叩いて、抽出した結果を、JSON化後連想配列でデータを取得したり編集したり、といったところでしょうか。 また、取得の仕方や出したい情報などは、なろうAPIの仕様をみながら考えてみるのもよいかと思います。
今回は簡単ですが以上となります。
それでは、ご覧いただきありがとうございました。
Google Apps Script 講座中級編「GASでGmailを検索してLINEで通知する」
はじめに
後藤銃士です。正月から始めた、FGO、なかなか★5が引けませんね。課金する人の気持ちが少しわかりました…。
さてようやく前回、前々回からやってきたことの集大成、「GASでGmailを検索してLINEで通知する」を実装します。いままでやってきたことの寄せ集めなので、基本難しいところはありません。やっていることは、
- Gmailを検索する
目的のメールが見つかったら、記録していたスプレッドシートをチェック
チェックがあればスルー。
チェックがなければまだLINEで通知をしてないので通知し、スプレッドシートに記録しておく。
という流れになります。また時間よる定期チェックは以前解説した「トリガー機能」をつかいます。
はい、それでは早速やっていきましょう。
前提条件
LINE Notify が動くように設定してあること
この機能が役に立つのは
Gmail を GAS で Gmail と LINE とトリガー機能のコラボを理解したい人
講座スタート
いつもどおりコピペだけで大丈夫です。が、その前に空のスプレッドシートを用意して下さい。
用意が出来ましたか?では、
新しくタブを開き「script.google.com」を入力してコードを書ける状態にして下さい。
そしてコード.gs に
function myFunction() { // スプレッドシート検索 var spreadsheet = SpreadsheetApp.openByUrl('あなたのスプレッドシートURL'); var sheet = spreadsheet.getSheetByName("シート1"); var lastrow = sheet.getLastRow(); Logger.log(lastrow); // 登録済スレッドID一覧取得 var range = [[""]]; if (lastrow > 0){ range = sheet.getRange(1, 1, lastrow).getValues(); } // メール検索 var query = 'subject:メルカリ subject:発送をお願いします'; var threads = GmailApp.search(query, 0, 3); // スレッド毎に件名をチェック threads.forEach(function(thread, i, array){ Logger.log(thread.getId()); Logger.log(thread.getLastMessageDate()); Logger.log(thread.getFirstMessageSubject()); // 件名の存在確認 var exists = range.filter(function(item, index){ if (item[0].indexOf(thread.getId()) >= 0) return true; }); // 存在しない場合 if(exists.length == 0){ // LINE通知 sendHttpPost(thread.getFirstMessageSubject()); // スプレッドシート追記 lastrow = sheet.getLastRow(); sheet.getRange(lastrow +1, 1).setValue(thread.getId()); } }); } function sendHttpPost(message){ var token = "あなたのトークン"; var options = { "method" : "post", "payload" : "message=" + message, "headers" : {"Authorization" : "Bearer "+ token} }; UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options); }
をコピペして保存します。
実行の前に
を設定しておいて下さい。
件名の検索
var query = 'subject:メルカリ subject:発送をお願いします';
検索条件の設定ですが、上記の例は、件名に「メルカリ」と「発送をお願いします」が両方入っているもの(いわゆる AND条件)を検索しています。 条件が1つだけで良ければ
var query = 'subject:メルカリ';
だけでよいですし、どちらか(いわゆる OR条件)の場合は、
var query = 'subject:メルカリ OR subject:発送をお願いします';
でいけます。
設定ができましたら実行してみましょう。実行対象は myFunction になります。
すると検索対象になったメールがあったら、LINE通知が来ているはずです。来ていますか?
次にスプレッドシートをみると、対象となったスレッドIDが登録されているのがわかると思います。
ではもう一度実行してみましょう。すると何も反応がないはず。
それはLINEに通知する際に、一度スプレッドシートのスレッドIDをチェックしているから、なんですね。
今回のポイントの1つに、配列の要素をチェックする、ということをやっています。それが以下。
// 件名の存在確認 var exists = range.filter(function(item, index){ if (item[0].indexOf(thread.getId()) >= 0) return true; });
最新の JS では気の利いたメソッドが実装されているようなんですが、GAS は古い JS をベースにしているので昔のテクニックでチェックしています。range にはスプレッドシートのA行目のデータが配列形式2次元で入ってます。
[["16847532765d0d1f"],["16844cebe50ddbc8"]]
で、filter メソッドを利用し、配列の配列の0番目つまり"16847532765d0d1f" や "16844cebe50ddbc8" を idndexOf を使い thread.getId() の内容を含んでいるかを判定しています、っていわれてもわからん場合は、「そんなもんか」と思っておくか改めて自分で調べるかして下さい(投げやり)。
というわけで、私の場合、メルカリに注文があった場合、LINEに通知がくるようになりました。目的は図書館の予約本到着メールなので、これも一緒に組み込むことにしています。
みなさんも件名の検索文字列を工夫して、自分のメールがいつ到着したかを LINE でチェック出来るようにしておくと便利だと思いますよ。あー、当然このソースは、トリガー設定しておくんですよ?私は4時間単位でチェックさせるようにしています。
今回は以上となります。
それでは、ご覧いただきありがとうございました。