【GAS】実践・タグクリエイター:ブログカード編

2021-01-21

GAS プログラミング

B!

GASで自前ブログカードづくり。
OGPのなんちゃってデータ取得方法の解説とか。




システム要件・完成目標とイメージ

※「ShareHtmlを、もっと綺麗にしたメーカー」というブログカードが簡単に作れる便利なサイトがありまして、自分でできないかなーと作ってみたのがこれです。
  • 個人的に利用する事を目的とする
  • GASのみで指定URLのOGPデータを取り出す
  • 取り出したデータをもとにブログカードのタグコードを自動生成する
  • ブログタイトルやurlなどの付加情報もつけられるようにする

スプレッドシートの準備

まずはスプレッドシートを準備します。
コンバートボタン、解析するURL、ブログカードに含めておきたい情報欄を作成します。

manageシート

ボタンへの関数の割り当て方法やボタンの作成方法がわからない場合はこちらで↓

ソースコード

Parserライブラリを利用しています。↓で解説してます。
  1. // -----------------------------------------------------------------------------
  2. // 【テスト】自動タグ作成:ブログカード.
  3. // -----------------------------------------------------------------------------
  4. // mngシート定数.
  5. var MngOutput = "E7"; // 結果出力先.
  6. var MngTarget = "E2"; // 解析元URL.
  7. var MngBlogCardTitle = "E3"; // ブログタイトル.
  8. var MngBlogCardURL = "E4"; // ブログURL.
  9. // -----------------------------------------------------------------------------
  10. // myFunction
  11. // 外部から呼び出される関数.
  12. // -----------------------------------------------------------------------------
  13. function myFunction() {
  14. var mngSheet = SpreadsheetApp.getActive().getSheetByName( "manage" );
  15. var out = "";
  16. var options = {muteHttpExceptions : true};
  17. var response = UrlFetchApp.fetch( mngSheet.getRange(MngTarget).getValue(), options );
  18. // 簡易エラーチェック.
  19. if ( (400 <= response.getResponseCode()) && (response.getResponseCode() < 600)) {
  20. mngSheet.getRange( MngOutput ).setValue( "エラー:" + response.getResponseCode() );
  21. return;
  22. }
  23. var tmp = Parser.data(response.getContentText()).from('<![endif]-->').to('<!--[if IE]>').iterate();
  24. out += "<div class=\"link-box\">";
  25. out += "<div class=\"img-box\">";
  26. out += "<a href=\"" + getURL(tmp[0]) + "\" style=\"text-decoration: none;\"><div style=\"background-image: url('" + getImage(tmp[0]) + "');\"></div></a></div>";
  27. out += "<div class=\"text-box\">";
  28. out += "<a href=\"" + getURL(tmp[0]) + "\" style=\"text-decoration: none;\"><p class=\"title\">" + getTitle(tmp[0]) + "</p></a>";
  29. out += "<a href=\"" + getURL(tmp[0]) + "\" style=\"text-decoration: none;\"><p class=\"description\">" + getDiscripton(tmp[0]) + "</p></a>"
  30. out += "<a href=\""+ mngSheet.getRange(MngBlogCardURL).getValue() + "\"><p class=\"bloginfo\">" + mngSheet.getRange(MngBlogCardTitle).getValue() + "</p></a></div>";
  31. out += "</div>";
  32. // 結果表示.
  33. mngSheet.getRange( MngOutput ).setValue( out );
  34. return;
  35. }
  36. // -----------------------------------------------------------------------------
  37. // get
  38. // OGPデータの取り出し.
  39. // -----------------------------------------------------------------------------
  40. function getURL( str ) {
  41. var tmp = str.match(/content='.*?' property='og:url'/gi);
  42. if ( tmp === null ) { return ""; }
  43. return tmp[0].substr(9, tmp[0].length-28);
  44. }
  45. function getTitle( str ) {
  46. var tmp = str.match(/content='.*?' property='og:title'/gi);
  47. if ( tmp === null ) { return ""; }
  48. return tmp[0].substr(9, tmp[0].length-30);
  49. }
  50. function getDiscripton( str ) {
  51. var tmp = str.match(/content='.*?' property='og:description'/gi);
  52. if ( tmp === null ) { return ""; }
  53. return tmp[0].substr(9, tmp[0].length-36);
  54. }
  55. function getImage( str ) {
  56. var tmp = str.match(/content='.*?' property='og:image'/gi);
  57. if ( tmp === null ) { return ""; }
  58. return tmp[0].substr(9, tmp[0].length-30);
  59. }

実行結果

解説

29行目:Parserを利用してコードを抜き出す

  1. var tmp = Parser.data(response.getContentText()).from('<![endif]-->').to('<!--[if IE]>').iterate();
Parserを利用してOGPデータのある部分をごっそり抜き出しています。

31行目~:自分が使いやすいようにコードをカスタマイズ

  1. out += "<div class=\"link-box\">";
  2. out += "<div class=\"img-box\">";
  3. out += "<a href=\"" + getURL(tmp[0]) + "\" style=\"text-decoration: none;\"><div style=\"background-image: url('" + getImage(tmp[0]) + "');\"></div></a></div>";
  4. out += "<div class=\"text-box\">";
  5. out += "<a href=\"" + getURL(tmp[0]) + "\" style=\"text-decoration: none;\"><p class=\"title\">" + getTitle(tmp[0]) + "</p></a>";
  6. out += "<a href=\"" + getURL(tmp[0]) + "\" style=\"text-decoration: none;\"><p class=\"description\">" + getDiscripton(tmp[0]) + "</p></a>"
  7. out += "<a href=\""+ mngSheet.getRange(MngBlogCardURL).getValue() + "\"><p class=\"bloginfo\">" + mngSheet.getRange(MngBlogCardTitle).getValue() + "</p></a></div>";
  8. out += "</div>";
ShareHtmlを、もっと綺麗にしたメーカー」をベースに作っています。悪しからず。
変更点と言えばブログタイトルとURLをくっつけたところくらいです。
自分の好きなように組んでOK。

53行目~:OGPデータの抜き出し

  1. function getURL( str ) {
  2. var tmp = str.match(/content='.*?' property='og:url'/gi);
  3. if ( tmp === null ) { return ""; }
  4. return tmp[0].substr(9, tmp[0].length-28);
  5. }
  6. function getTitle( str ) {
  7. var tmp = str.match(/content='.*?' property='og:title'/gi);
  8. if ( tmp === null ) { return ""; }
  9. return tmp[0].substr(9, tmp[0].length-30);
  10. }
  11. function getDiscripton( str ) {
  12. var tmp = str.match(/content='.*?' property='og:description'/gi);
  13. if ( tmp === null ) { return ""; }
  14. return tmp[0].substr(9, tmp[0].length-36);
  15. }
  16. function getImage( str ) {
  17. var tmp = str.match(/content='.*?' property='og:image'/gi);
  18. if ( tmp === null ) { return ""; }
  19. return tmp[0].substr(9, tmp[0].length-30);
  20. }
ここがなんちゃって抜き出し部分です。
見るからにやっつけ感があります。なにかいい方法があるかもしれません。

CSS

ここも自分の好きなようにしてください。
  1. #single-content .link-box {
  2. border:1px solid #e1e1e1;
  3. padding:10px;
  4. display:flex;
  5. margin:30px
  6. }
  7. #single-content .link-box:hover {
  8. background-color:#f3f3f3;
  9. -webkit-transition:background-color .35s;
  10. transition:background-color .35s
  11. }
  12. #single-content .img-box {
  13. width:25%;
  14. float:left
  15. }
  16. #single-content .img-box div {
  17. min-height:170px;
  18. background-size:cover;
  19. background-position:center center
  20. }
  21. #single-content .text-box {
  22. width:75%;
  23. float:left;
  24. padding-left:20px;
  25. line-height:1.7;
  26. margin:0
  27. }
  28. #single-content .text-box .title {
  29. font-size:18px;
  30. font-weight:600;
  31. color:#428bca;
  32. padding:0;
  33. margin:0
  34. }
  35. #single-content .text-box .description {
  36. font-size:15px;
  37. color:#333;
  38. padding:0
  39. }
  40. #single-content .text-box .bloginfo {
  41. font-size:13px;
  42. color:#333;
  43. padding:0
  44. }
  45. @media only screen and (max-width:479px) {
  46. #single-content .img-box div {
  47. min-height:80px
  48. }
  49. #single-content .text-box {
  50. margin-left:10px;
  51. line-height:1.5
  52. }
  53. #single-content .text-box .title {
  54. font-size:13px;
  55. margin:0
  56. }
  57. #single-content .text-box .description {
  58. font-size:11px;
  59. margin-top:5px
  60. }
  61. #single-content .text-box .description {
  62. font-size:9px;
  63. margin-top:5px
  64. }
  65. }



ブログランキング・にほんブログ村へ

Translate

魔王と愉快な仲間

このブログを検索

ラベル

ブログ アーカイブ

メッセージ

名前

メール *

メッセージ *

Powered by Blogger.

フリー写真素材ぱくたそ

QooQ