LoginSignup
47
49

More than 5 years have passed since last update.

静的サイトでもお知らせ記事を更新できる仕組みを作った。無料、要Googleアカウント

Last updated at Posted at 2016-12-26

なぜ作ったか

静的サイトなクライアントワークでも、更新を手軽にやりたい、というニーズは意外と多くあります。

むしろ、ちょっとした更新のためだけに、大掛かりなCMSを入れるのはめんどくさい。静的なページが数ページだけなら、むしろスタティックでGit管理したほうが楽。

でも、ちょっとしたお知らせはしたい。

そういうニーズを解決するために、いくつかの方法を考えました。

1行お知らせぐらいなら、外部から読み込んでしまえ!

1行お知らせというのは、個人的に使っているWeb用語なのですが、要は小規模のサイトでトップページにお知らせが並ぶけど、それをクリックしても、詳細ページには飛ばない、つまり一覧しかないというお知らせの見せ方です。

そもそも、サイトによっては、お知らせといっても、詳細ページを用意するほどのお知らせがなかったり、頻繁に更新したりしないケースもあります。

そういう時に、うっすーい内容の詳細ページを作ったら逆にSEO的には効果減じられかねないですし、詳細ページ作らないのに、WordPressみたいな大きめのCMS入れるのもアホみたいです。

それなら、JSで外部から読み込むほうが楽かな、と。

更新内容のソースはどうするよ?

いろいろ考えられますが、ソースファイルをJSONとかで置くのはNGです。だって、クライアントワークで、FTPにログインさせるなんて、クライアントのUX的にはNGです。(担当の方がHTML触れる人なら別ですが)

そこで、一般の人でも扱えて、それなりに入力や編集がやりやすい、ってことでGoogleスプレッドシートに更新内容のソースを置いてみます。

サンプルのスプレッドシートです

こんな感じで作ってみました。

これなら、一般の人でも編集できそうですね。Googleスプレッドシートなら、バージョン管理もしてくれるので、うっかりやらかしても差し戻しが簡単ですし。

実装するよ!

まず、こちらの記事を参考にして、下記のようなソースコードを書いてみました。

index.js
var url = 'https://spreadsheets.google.com/feeds/cells/1Ui7nDh9WWJ5zADOm73odxso3G6GsZ4zSCsT7_iN0-bE/od6/public/values?alt=json';

var target = $('#news');

function nl2br (str, is_xhtml) {   
    var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '<br />' : '<br>';    
    return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1'+ breakTag +'$2');
}

$.getJSON(url,
  function(data) {
    var list = data.feed.entry;
    var b = list.length;
    var cnt    = 4;              // いくつずつに分割するか
    var Arr = [];             // 新しく作る配列

    for(var i = 0; i < Math.ceil(b / cnt); i++) {
      var j = i * cnt;
      var p = list.slice(j, j + cnt); // i*cnt 番目から i*cnt+cnt 番目まで取得
      Arr.push(p);                    // 取得したものを newArr に追加
    }

    for(var i = 0; i < Arr.length; i++) {

        if(Arr[i][1].content.$t == 1) {
          target.append(
            '<li class="row-' + i + '"><section>' +
              '<h1><time>' + Arr[i][0].content.$t + '</time>' +
              '<span>' + Arr[i][2].content.$t + '</span></h1>' +
              '<p class="desc">' + nl2br(Arr[i][3].content.$t) + '</p>' +
            '</section></li>'
          );
        }
    }
    console.log(Arr);
  }
)

$(document).on('click','#news li',function(){
  $(this).find('.desc').slideToggle();
  $(this).toggleClass('open');
});

URLの取得のところは、元記事を参考にしてください。(取得までちょっと手間ですが…)

あとは、jQueryでゴニョゴニョっと整形しています。改行が無視されるので、nl2br関数を作っています。

1行お知らせながら、1段落程度、簡単なディスクリプションが書けるようにもしていますので、そこはアコーディオンするようにもしました。

HTMLとCSSはこんな感じです。

index.pug
h1 お知らせ
nav
  ul#news
style.scss
* {
  box-sizing: border-box;
}
body {
  padding: .5em;
}
h1 {
  font-size: 24px;
  border-left: 4px solid red;
  padding-left: .5em;
  margin-bottom: 1em;
}

#news {

  li {
    border-top: 1px solid #ddd;
    &:last-child {
      border-bottom: 1px solid #ddd;
    }
    padding: 0 {
      top: 1.5em;
      bottom: 1.5em;
    }
  }

  h1 {
    border-bottom: 0;
    font-size: 17px;
    padding-left: 0;
    border-left: 0;
    line-height: 1;
    vertical-align: bottom;
    span {
      display: inline-block;
    }
    time {
      display: inline-block;
      margin-right: 2em;
      background: #ddd;
      font-size: 10px;
      padding: 0 {
        top: .5em;
        bottom: .5em;
        left: 1.5em;
        right: 1.5em;
      }
    }
    &::before {
      content: "+";
      font-size: 85%;
      border: 1px solid #ddd;
      padding: .2em;
      line-height: 0;
      margin-right: 1em;
    }
  }

  .open h1::before {
    content: "-";
    border: 0;
  }

  .desc {
    display:none;
    font-size: 14px;
    line-height: 1.7;
    margin-left: 3em;
  }
}

出来上がりはこちら

See the Pen Googleスプレッドシートから一行お知らせを読み込む by Kohki SHIKATA (@kohki-shikata) on CodePen.

47
49
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
47
49