Google Apps Script @福岡

GASで面白Webサービス&コスト削減や!

Google Apps Script 講座初級編「GASでLINE Notfiyを利用し通知をする」

はじめに

後藤銃士です。健康大事です。いやーほんとに。

前回予告していた「LINE での通知」の実装を行います。LINE での通知には実装が2種類あります。

  • LINE Notify … Webサービスと連携し、Webサービスから通知を受け取る

  • LINE Messaging API … LINEユーザーと双方向でやり取りを行う

今回はこちらからデータを送ることは想定していないので、通知を受け取るLINE Notifyを利用します。外部のサービスを利用すると、ぐっとプログラムしている気分になりますね。

この機能が役に立つのは

GAS で LINE に通知をしてみたい人向け

講座スタート

いつもどおりコピペだけで大丈夫です。が、その前にLINE Notfity を利用するために「アクセストークン」というものが必要になりますので、まずはその解説から。

外部のサービスを使うので準備が必要となります。今回はLINEのアクセストークン、というものが必要となります。

アクセストークンとは

LINE Notify を利用するには、LINE のアカウントが必要です。そしてサービスを利用するためにアクセストークンを取得する必要があります。

アクセストークンとはざっくりいうと、特定の人向けに用意された合言葉で、LINEはこれをみて、あー、〇〇さんがLINE Notifiy を使っているんだなーと判断するための材料となるわけです。

取得の手順は、https://notify-bot.line.me/ja/ にアクセスします。

f:id:jijyoronn:20190113170603p:plain

ログインすると右上にご自身の名前が出てきます。

f:id:jijyoronn:20190113170832p:plain

クリックするとメニューが出ます。そこでマイページをクリック。 画面の下にいくと、「アクセストークンの発行」というボタンがあるので押下します。(←これ「おうか」って読むんですよね。最初これ読めなくて恥をかいた記憶があります…)

f:id:jijyoronn:20190113170941p:plain

すると、「トークンを発行する」画面がでてきます。

f:id:jijyoronn:20190113171255p:plain

ここで発行するトークンの設定を行います。「1:1でLINEで Notifyから通知を受け取る」を選択した場合、「LINE Notify」というアカウントにメッセージが表示されます。また、特定のトークルームに通知したい場合は、事前にトークルームを作っておくとよいです。

今回は「LINE Notify テスト」というトークルームを作っています。

ここで「発行する」を押すと、アクセストークンが発行されますので、どこかにメモしておきましょう。

f:id:jijyoronn:20190113171401p:plain

用意が出来ましたか?では、

新しくタブを開き「script.google.com」を入力してコードを書ける状態にして下さい。

そして今回は、コード.gs にまるっとコピペして下さい。 アクセストークンはさきほどメモしたものに差し替えましょう。 なお、

function myFunction() {
  var message = "テスト";
  sendHttpPost(message);
}

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);
}

f:id:jijyoronn:20190113171531p:plain

それでは実行してみましょう…と、その前に。「LINE Notify テスト」に「LINE Notfity」を招待しておいて下さい。 では実行して下さい。 なお、実行する際は、 myFunction を選択して「実行」すること。

f:id:jijyoronn:20190113171553p:plain

※なお、例によって権限の許可について聞かれますので各自適宜対応して下さい。

このようにトークルームにメッセージが表示されます。

f:id:jijyoronn:20190113171836p:plain

今回は新しく、関数を分けています。実行しているのは、myFunction() ですが、その中で sendHttpPost(message) を呼び出しています。すると、6行目以降の関数が実行されるわけですね。で実行の際、呼び出し元の message 内容を引き継ぎます。

ですから myFunction() で指定した「テスト」という文言が渡され、結果 UrlFetchApp.fetch によりLINEへとデータを渡しているのですね。

表示したいメッセージを変えたければ、呼び出し元の message を変えるだけでよい、ということなります。複数送りたければ、

function myFunction() {
  var message = "テスト";
  sendHttpPost(message);
  message = "テストその1";
  sendHttpPost(message);
  message = "テストその2";
  sendHttpPost(message);
}

と書けばどんどん増やすことも可能です。

このように最初は少しめんどうですけどきちんと準備してあげれば LINE にメッセージを表示させることが至極簡単であることが理解出来たのではないでしょうか。

次回、Gmail 検索とLINE Notfiy を組合せて「Gmail に予約本到着メールが届いたら、Line で通知する」を作りたいと思います。

今回は以上となります。

それでは、ご覧いただきありがとうございました。

Google Apps Script 講座初級編「GASでGmailを検索する」

はじめに

後藤銃士です。腰痛でダウンしています。

さて今回は趣を変えまして、Gmail を取り扱います。図書館でオンライン読みたい本を予約しています。予約していた本が届くと、登録していた Gmail アドレスに通知がくるんですけどたまに見逃すことがありました。ですので今回、見逃さないようにするための仕組みづくりをしたいと思います。

私は現在 Line を使っていますので、Gmail に予約本が届いたら、Line で通知があると便利かなと。以下の流れで GAS を組めばいけそうな気がします。

  • Gmail の件名に「予約本到着」の文字列を含むメールが来ているか監視する

  • 来ていた場合は Line bot に通知する

基本はこの2つですね。あとは監視〜通知に至る処理が必要となります。この処理をつなぐところがイメージできればプログラミングは楽しくなりますね。

今回はまず、「GASでGmailを検索する」をやります。

この機能が役に立つのは

Gmail を GAS で操作してみたい人向け

講座スタート

いつもどおりコピペだけで大丈夫です。

新しくタブを開き「script.google.com」を入力してコードを書ける状態にして下さい。

そしていつもどおり1行目の3行目の間に

  var query = '検索したい言葉';
  var threads = GmailApp.search(query, 0, 5);
     
  threads.forEach(function(thread, i, array){
    Logger.log(thread.getId());
    Logger.log(thread.getLastMessageDate());
    Logger.log(thread.getFirstMessageSubject());
  });

をコピペして保存します。

f:id:jijyoronn:20190113110508p:plain

それでは実行してログをみてみましょう。

f:id:jijyoronn:20190113110525p:plain

このように検索した結果を取得することができます。 ご自身 Gmail で同じように検索してみると、一致しているのがわかると思います。

f:id:jijyoronn:20190113110556p:plain

コードを見るとわかると思いますが、Gmail のメールって、やりとりを繰り返すとひとまとめにされてしまうのですね。それを「スレッド(thread)」と呼んでいます。スレッドって撚り糸(よりいと)ですから、1本の糸をよりあわせて1つの糸にする、つまりこの場合はメールをひとまとめに扱っている、というわけです。

で、スレッド単位で検索しておいて、そのうちの getFirstMessageSubject() を使ってそのスレッドの1番最初のメールのタイトルを取得してきています。受信しただけのメールでしたら大抵スレッドにはなっておらずメール=スレッドのような扱いにはなりますが、Gmail の仕様上こんなふうにスレッドを取得しています。

なお、スレッド検索に使っている

  var threads = GmailApp.search(query, 0, 5);

の数字ですが、

  • 0 … 検索開始位置です。0番目なので最初から(大抵の処理では一番最初は0から始まるケースが多い)

  • 5 … 最大取得数。この場合最大5件のスレッドを取得する、という意味です

というわけであっさり取得することができましたね。例によって保存したければ、スプレッドシートに書き込むとよいですね。

それでは次回は、LINE での通知にチャンレジします。実装は簡単なんですけど、説明を書くのが大変なので時間がかかるかもしれませんが、しばしお待ち下さい。

今回は以上となります。

それでは、ご覧いただきありがとうございました。

GAS講座10記事突破に寄せて

後藤銃士です。どんなジャンルでも突き抜ければ1人者になれると信じています。

Google Apps Script に可能性を感じ、先人のブログを参考しながらGAS(Google Apps Script )の活用方法について記事を書いてきました。取り立てて詳しいわけでないのですが、なにかお手軽にWebを使った情報収集(スクレイピング)や、なんちゃってAI(チャットbot)、WebAPI を利用して仕事や生活に役立つことを念頭におき、机の前でうんうんと頭をひねっては記事を作っております。

RPAについて

お正月にふと「自動化だ!」とひらめき、博多駅にある丸善でコンピューター本の棚をさまよっていたときに「RPA」という言葉に出会いました。「RPA」とは、ロボティック・プロセス・オートメーションの略で、早い話が、事務作業でやってるパソコン業務手順を自動化してコスト削減を狙う技術の総称で、総務省のメルマガ「M-ICT ナウ vol.21 2018 年5月第2号」のトピックスでも取り上げてられております。

曰く、

従来よりも少ない人数で生産力を高めるための手段として、現在、RPA(ロボットによる業務自動化:Robotics Process Automation)が注目を集めています。2017年の調査によると、国内では14.1%の企業が導入済み、6.3%が導入中、19.1%が導入を検討中でした。市場規模は2017年度が31億円、2021年度には100億円規模になると予測されています。

とか書かれていて「えーそれは言い過ぎでは?」という気がしなくもないですが、人口が減り事務作業者も確実に減ることが予想されますから当然、RPAに限らず業務の「自動化」を行わないことには、いまの水準の維持だって危ういことは自明です。

だからこそ「自動化」「省略化」はどの現場でも求められることになるでしょう。

GAS と自動化

ところでこのブログで取り上げている GAS ですがそもそも G Suite(オフィスソフト群) を制御することを(たぶん)主眼として作られており、仮にですが事務作業につかうオフィスソフトを G Suite に統一してしまえば、GAS で大抵のことは自動化できますので、恐ろしく人件費削減が可能であり、その費用をより事業拡張へと振り分けることが出来るようになるのではないか。

なので、MS Office を使っている現場があるのであれば、G Suite への全面的な移行+GASを組合せた事務作業の自動化によって他社に差をつけることが可能になるのではないかと考えています。

実際今勤務している会社では、勤務表をExcel で管理し全国の支店からそれらをメールで集めた後、手で集計、チェックしているらしく月末の総務室はいつもずっと遅くまで仕事をしているとか…。どう考えても非効率非合理ですもんね。

なので提案できるようにこっそり G Suite + GAS を絡めた管理システムを構築して自社に売りつけてやろうと思っていますw

それを作ることができれば大体的にこのブログでもネタとして扱えるので美味しいw。

というわけで、引き続き GAS の記事を書いていきます。目標は今年中に100記事書いて、マナブさんに添削してもらうことです。

(ブログのデザインや、プロフィールページの作成、アイキャッチ画像の挿入など、やらなきゃいけないことは、ある程度わかっているのでそれらをクリアしてから添削してもらうぞ!それとタイ・バンコクにも身体が動くうちに遊びにいきたい)

参考書

「いちばんやさしいRPAの教本」

Google Apps Script 講座初級編「GASでスプレッドシートの列の幅を自由に設定する」

はじめに

後藤銃士です。昨日作った、「GASでスプレッドシートの列の表示形式を日時に設定する」ですがあれです、デフォルトだと100ピクセルに設定されていて時間まで細かく表示しちゃうと、幅が狭すぎて不便でしたね?

というわけで今回は、登録するまえに列の幅を設定してしまおう、というものです。前回一緒にやっておけばええやんけ、という気がしますがこういう細かいニーズってまとめて書いてしまうと埋もれてしまいがちかなと。それにブログとしても記事が増えますし(本音)。

ちなみに前回の表示形式もそうですが、一度設定してしまうと変更するまで変化しませんので、GAS で組み込む際はシートを追加するタイミングで1度だけにしておくとよいですね。

この機能が役に立つのは

スプレッドシートを使うとき、ほんのちょっと便利にしたい人向け

講座スタート

いつもどおりコピペだけで大丈夫です。が、その前に空のスプレッドシートを用意して下さい。

f:id:jijyoronn:20190108220754p:plain

用意が出来ましたか?では、

新しくタブを開き「script.google.com」を入力してコードを書ける状態にして下さい。

そしていつもどおり1行目の3行目の間に

  var spreadsheet = SpreadsheetApp.openByUrl('ご自身のスプレッドシートのURL'); 
  var sheet = spreadsheet.getSheetByName("シート1");
  var lastrow = sheet.getLastRow();
  Logger.log(lastrow);
  
  if(lastrow == 0){
    sheet.getRange("A:A").setNumberFormat("yyyy/mm/dd hh:mm:ss"); // 日付フォーマット
    sheet.setColumnWidth(1,150); // 幅の設定
  }
  var today = new Date();
  sheet.getRange(lastrow +1, 1).setValue(today);
}

をコピペして保存します。

f:id:jijyoronn:20190108220818p:plain

それでは実行してみましょう。

f:id:jijyoronn:20190108220850p:plain

ほら。日付が被らずに表示されています。見やすい…。

今回追加したのは

    sheet.setColumnWidth(1,150); // 幅の設定

ですね。1つ目の欄に、列番号を指定します。A列=1番という認識です。2つ目の欄がピクセル数になります。 デフォルトの100では足りませんからね。150ぐらいがちょうどよさそうでした。

▼150ピクセルに設定されていることがわかります f:id:jijyoronn:20190108220932p:plain

  if(lastrow == 0){
    sheet.getRange("A:A").setNumberFormat("yyyy/mm/dd hh:mm:ss"); // 日付フォーマット
    sheet.setColumnWidth(1,150); // 幅の設定
  }

このあたりは気配りです。lastrow が 0 の場合、すなわちまだデータが登録されていない場合に、日付と幅の設定を行います。1つ追加されたらこの設定を改めてする必要はないので、動作させないようにしているわけです。無駄ですからね。

この無駄を極力排除する、という考え方は非常に重要ですから頭に叩き込んでおきましょう。無駄がないほうが処理が早くなります。今は体感できませんが、これから先、繰り返し処理が発生する場合に威力を発揮しますからね。

今回は以上となります。

それでは、ご覧いただきありがとうございました。

Google Apps Script 講座初級編「GASでスプレッドシートの列の表示形式を日時に設定する」

はじめに

後藤銃士です。以前作った「GASで月が変わるとスプレッドシートに書込むシートを自動で切り替える」、タイトルどおりなのですが、左列の日時設定、デフォルトですと「日付」形式になるんですね。つまり「2019/01/07」となり時間が表示されません。

毎時間記録していると、24行すべてが「2019/01/07」と表示されて時間の情報がわからないし、わざわざシートが追加されるたびにメニューから設定するのも微妙に面倒。なので最初から「日時」設定にしておきたい。「2019/01/07 22:56:25」のよう最初から表示したい、と思ったので調べました。

今回は「日時」ですがルールがわかってしまえばたいていの形式に変換できるようになります。

この機能が役に立つのは

スプレッドシートを使うとき、ほんのちょっと便利にしたい人向け

今回は初級編「GASでスプレッドシートの列の表示形式を日時に設定する」

対象

  • GAS初級者

学べること

講座スタート

いつもどおりコピペだけで大丈夫です。が、その前に使うスプレッドシートを用意して下さい。

ちなみにA列の表示形式は自動となっています。

f:id:jijyoronn:20190107230612p:plain

用意が出来ましたか?では、

新しくタブを開き「script.google.com」を入力してコードを書ける状態にして下さい。

そしていつもどおり1行目の3行目の間に

  var spreadsheet = SpreadsheetApp.openByUrl('ご自身のスプレッドシートのURL'); 
  var sheet = spreadsheet.getSheetByName("シート1");

  sheet.getRange("A:A").setNumberFormat("yyyy/mm/dd hh:mm:ss"); 

  var today = new Date();
  sheet.getRange(1, 1).setValue(today);

をコピペして保存します。

f:id:jijyoronn:20190108213931p:plain

それでは実行してみましょう。

f:id:jijyoronn:20190107230849p:plain

ちょっと行が狭いですね。なのでこうやって横に伸ばすと…

f:id:jijyoronn:20190107230920p:plain

こんなふうに最初から時間も表示されるようになりました。 便利ですね。

今回は日付のフォーマットを変更してみましたが、例えば金額ですとカンマを自動的に入れたりしますけど、そういった設定も setNumberFormat() を使うと可能になります。

フォーマットの例は以下を追って下さい。

f:id:jijyoronn:20190107231005p:plain

で、カスタム数値形式を選択すると、

f:id:jijyoronn:20190107231016p:plain

表示形式指定サンプルがいろいろ出てくるので、これを真似して、setNumberFormat() に設定すればよいです。 便利だなーと思ったら早速組み込んでみましょう。

今回は以上となります。

ご覧いただきありがとうございました。

Google Apps Script 基礎編「GASを知るのにふさわしい3大Web情報源」

はじめに

GASを「自分でカスタマイズしていこう」とか「こんな機能GASで実現するのはどうすればよいだろう?」と考えたときに、ゼロから考えるのはあまりに非効率なので皆さん、巨人の肩に乗ってショートカットしていきましょうという話をしていきます。

実際のところ、自分がこんな便利ツール欲しいなー、と思ったものは大抵他の人も考えていますし、その中で技術のある人が気まぐれに実装してしまい、あまつさせそのソースをネットに公開してくれたりしています。なので、具体的な見通しが立っていない場合は、Google で検索するのが手っ取り早いのですが、単純に検索するだけではなかなか欲しい情報がヒットしません。

そこで私がいつもお世話になっているサイトを3つ、紹介したいと思います(ご存知だとは承知の上で!)。

いつも隣にITのお仕事の「Google Apps Script」カテゴリ(https://tonari-it.com/category/google-apps-script/)

ここは鉄板です。大抵のやりたいことがそろっているといってよいでしょうね。2015/10/18 からこつこつと記事が追加されており、本日(2019/01/07)時点で231本もの記事が存在しています。その集大成たる「詳解! GoogleAppsScript完全入門~GoogleApps & G Suiteの最新プログラミングガイド~」という書籍は日本での GAS のバイブルといってよく、リファレンスとしても重宝しますので、即購入して手元においておきましょう。

ただあまりに細かく分類しすぎて、1つの記事だけでは何をいいたいのかわからない!ということもあるかと思うので、そういうときは前後の記事を読むようにしましょう。大抵、シリーズ化されており、1つの実装を7~8記事で説明しているケースがあります。

扱っている技術も GAS のみではなく Vue.js や Python と組合わせてみたりと活用範囲も広いので「GASを極めたい!」という人は全記事読破するのもおススメです。

技術系Q&Aサイト「Qiita」の「GoogleAppsScript」タグ(https://qiita.com/tags/googleappsscript)

Google検索でも良く引っかかる「Qiita」です。タグが付けられていますのでそれを追っていけば GAS の様々な活用方法が発見できますし、自分の興味のあるキーワードで検索するのもよいでしょう。初心者向けにこれを知っておくといい、みたいな心構えとか、ただチュートリアルをやりました、みたいな無味乾燥した投稿もありますが、それらを眺めつつトレンドを抑えておくのも悪くないと思います。

私などは、同じような機能を別の人がいろんな実装をしていたりするので、その差分などを眺めて参考にしたりしています。

本家(https://developers.google.com/apps-script/)

ここにしか情報がない、というケースが多いです。そりゃそうなんですけど、デフォルトは英語なんでとっつきにくいかもしれないですね。そんなときは、Chomeで閲覧するとすぐ「このページを翻訳しますか?」って出ますのでさくっと翻訳してもらうといいです。サンプルソースまで翻訳しちゃいますので困りますが、私は翻訳したChomeの画面と翻訳していないFireFoxの画面を並べて確認したりしています。

以上、3つのサイトを紹介しました。活用していただけたら幸いです。

Google Apps Script 講座中級編「GASでGoolge検索結果をスプレッドシートに自動で貼り付ける」

はじめに

後藤銃士です。最近の趣味はWebプログラミングスクールのマネタイズの仕組みを調べることです。

そのために Google で検索をしているのですが、こういうのって1度に50〜100サイトぐらいざっとみないと大枠がつかめないことが多いと思うのです。で毎回感想を簡単に記録しておきたい。

そのために検索結果からリンクを踏んで該当サイトへいき、URLとサイト名を手でスプレッドシートに書くのは億劫!というわけで、 「Google検索結果のURLとタイトルを自動でスプレッドシートに追加する」GASを作りましたので共有いたします。

予め用意しておくのは、スプレッドシートと「検索ワード」という名前のシートです。検索する際、「検索ワード」シートに検索文字をいれてGASを起動すると、「検索ワード」でシートを追加し、そのシートに検索結果を追加してくれます。私的にすこぶる便利。

この機能が役に立つのは

広大なインターネッツの情報を労力少なめに調べ結果をまとめたい老若男女

今回は中級編「GASでGoolge検索結果をスプレッドシートに自動で貼り付ける」

対象

学べること

講座スタート

いつもどおりコピペだけで大丈夫です。が、その前に使うスプレッドシートを用意して下さい。今回は「検索ワード」シートも用意して下さい。シート名を変えるだけです。

f:id:jijyoronn:20190104195236p:plain

用意が出来ましたか?では、

新しくタブを開き「script.google.com」を入力してコードを書ける状態にして下さい。

そしていつもどおり1行目の3行目の間に

  // スプレッドシート設定
  var spreadsheet = SpreadsheetApp.openByUrl('ご自身のスプレッドシートのURL');
  var sheet = spreadsheet.getSheetByName('検索ワード'); // 検索ワード記載シート
  var lastrow = sheet.getLastRow(); // 最後の行番号
  var searchWord = sheet.getRange(lastrow, 1).getValue();
    
  // シート設定
  var writeSheet = spreadsheet.getSheetByName(searchWord);
  if(writeSheet){
  }else{
    spreadsheet.insertSheet(searchWord);
  }
  
  // 検索結果取得
  var encodeWord = encodeURI(searchWord);
  var displayNum = 20; // 検索数
  var url = "https://www.google.com/search?q=" + encodeWord + "&num=" + displayNum;
  Logger.log(url);
  var response = UrlFetchApp.fetch(url).getContentText('UTF-8');

  
  // 抽出
  var myRegexp = /<h3 class=\"r\">([\s\S]*?)<\/h3>/gi;
  var elems = response.match(myRegexp);
  for(var i in elems) {
    
    var title = elems[i]    
    title = title.replace(/<b>|<\/b>/gi, "");
    title = title.match(/<h3.*><a.*?>(.*?)</)[1];

    var url = elems[i];
    url = url.match(/\?q=(.*?)\&amp?/)[1];
    
    writeSheet = spreadsheet.getSheetByName(searchWord);
    Logger.log(writeSheet);
    var lastrow = writeSheet.getLastRow();
    writeSheet.getRange(lastrow +1, 1).setValue(title);
    writeSheet.getRange(lastrow +1, 2).setValue(url);
  }

をコピペして保存します。

f:id:jijyoronn:20190104195421p:plain

次に検索したいワードを「検索ワード」シートの1番最初に記載します。ここでは「ウェブカツ」とします。

f:id:jijyoronn:20190104195446p:plain

それでは実行してみましょう。

f:id:jijyoronn:20190104195522p:plain

こんな感じで検索ワードでシートが生成され、Google検索結果から、タイトルとURLを抽出しシートに書き込んでくれます。 ただGoogle先生のご機嫌が悪いと、うまく取れない場合があるようです。その場合は数秒おいてから再実行してみて下さい。

↓こんな場合ですね f:id:jijyoronn:20190104195655p:plain

では解説を少しだけ。

まずGoogleの検索処理URLの組み立てですが、実行後ログを見て下さい。

f:id:jijyoronn:20190104195728p:plain

こんなふうに生成されています。これこのままブラウザに入れると検索されます。

https://www.google.com/search?q=%E3%82%A6%E3%82%A7%E3%83%96%E3%82%AB%E3%83%84&num=20

このq=から、&num までの文字列(赤文字)が「ウェブカツ」という日本語を翻訳した文字列となります。Google先生に理解していただくための「おまじない」です。一般にはURLエンコードと呼ばれる処理で、本来はいろいろあるんですが、GAS上というか JavaScript 上では encodeURI() を使えばうまいことやってくれるのでそのまま利用しています。

今回一番のキモは抽出のあたりですね…このあたりはそうですね、別途「正規表現」の記事を書くとします。ざっくり説明すると、

  var myRegexp = /<h3 class=\"r\">([\s\S]*?)<\/h3>/gi;
  var elems = response.match(myRegexp);

指定した検索結果に対して、myRegexp で指定した正規表現指定でマッチ(合致)した部分、ここでは h3 タグに囲まれた部分ですが、欲しい情報はタグ内の情報、つまりh3 タグに挟まれたテキスト部分、つまりカッコ内です。カッコを指定するとカッコ内だけが取り出されます。 さ・ら・に、g オプションを付けておくと複数マッチした場合、その個数分 elems に配列形式で代入されます(何をいっているかわからん人、スマン…)。

<h3 class="r"><a href="/url?q=https://webukatu.com/&amp;sa=U&amp;ved=0ahUKEwjTm67w9NPfAhXK3YMKHeWGB4gQFggUMAA&amp;usg=AOvVaw3xYRHPt6oE7VlQW_9puee-"><b>ウェブカツ</b>!!</a></h3>

Googleの検索結果には上記のように出力されていますから、この場合は、a タグ部分が取得されるわけです。

<a href="/url?q=https://webukatu.com/&amp;sa=U&amp;ved=0ahUKEwjTm67w9NPfAhXK3YMKHeWGB4gQFggUMAA&amp;usg=AOvVaw3xYRHPt6oE7VlQW_9puee-"><b>ウェブカツ</b>!!</a>

これが、num の数分基本取得されます。20 で設定しているので 20 URL分取得されます(が、Google先生の機嫌で前後します)。

  for(var i in elems) {
    
    var title = elems[i]    
    title = title.replace(/<b>|<\/b>/gi, "");
    title = title.match(/<h3.*><a.*?>(.*?)</)[1];

    var url = elems[i];
    url = url.match(/\?q=(.*?)\&amp?/)[1];
    
    writeSheet = spreadsheet.getSheetByName(searchWord);
    Logger.log(writeSheet);
    var lastrow = writeSheet.getLastRow();
    writeSheet.getRange(lastrow +1, 1).setValue(title);
    writeSheet.getRange(lastrow +1, 2).setValue(url);
  }

取得された数だけ、for で繰り返します。

タイトル

タイトルは、赤文字なので、一旦、bタグを、replace で削除します。で、次に a タグに挟まれた文字列を取得しています。

    var title = elems[i]    
    title = title.replace(/<b>|<\/b>/gi, "");
    title = title.match(/<h3.*><a.*?>(.*?)</)[1];
<a href="/url?q=https://webukatu.com/&amp;sa=U&amp;ved=0ahUKEwjTm67w9NPfAhXK3YMKHeWGB4gQFggUMAA&amp;usg=AOvVaw3xYRHPt6oE7VlQW_9puee-"><b>ウェブカツ</b>!!</a>

ここから

ウェブカツ

が取り出せます。

URL

同じように match を使って取り出しています。

    var url = elems[i];
    url = url.match(/\?q=(.*?)\&amp?/)[1];
<a href="/url?q=https://webukatu.com/&amp;sa=U&amp;ved=0ahUKEwjTm67w9NPfAhXK3YMKHeWGB4gQFggUMAA&amp;usg=AOvVaw3xYRHPt6oE7VlQW_9puee-"><b>ウェブカツ</b>!!</a>

ここから

https://webukatu.com/

が取り出せます。

まとめ

いやー、正規表現難しいっすよね…。これだけで専門書もある世界なので仕方ないんですけどね…。 ちなみに、「検索ワード」シートの検索文字ですが、getLastRow() を使っているのでどんどん下に追記していってもよいですよ。

f:id:jijyoronn:20190104202014p:plain

こんな感じなります。いやー調査が捗りますね。

f:id:jijyoronn:20190104202042p:plain

そんなわけで今回は、Google Apps Script 講座中級編「GASでGoolge検索結果をスプレッドシートに自動で貼り付ける」でした。今回は普通に URL を叩いて取得してきましたが、次回は、ログイン処理が必要なサイトのデータの引っ張り方について調べて記事を上げたいと思います。

それでは、ご覧いただきありがとうございました。