2015年6月27日土曜日

Loading表示を改良

loadingをもうちょっと改良してみました
まずloadingが終了するまで触れないよう
半透明のdivを重ねました
ついでに画像でもやってみました
※jqueryが必要です。

つれづれなるまゝに:退屈なこと、さみしいこと、無聊。 日くらし:<ひぐらし>と読む。
朝から晩まで。終日。 ひねもす。 心に移りゆくよしな

      test :function () {
        var j = 100;
        for (var i = 0; i < j ; i++){
          console.log(i);
        }
      }
      

龍神スカイライン


ではHTMLから
    <head>
    <script src='http://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js'></script>
    </head>
    <!-- 文章  -->
    <div id="waku1">
      <div class="main">
      つれづれなるまゝに:退屈なこと、さみしいこと、無聊。 日くらし:<ひぐらし>と読む。
      <br> 朝から晩まで。終日。 ひねもす。 心に移りゆくよしな
      </div>
      <div class="scrn"></div>
      <div class="load"></div>
    </div>
    
    <!-- sytax  -->
    <div id="waku2">
    <div class="main">
    <pre class="brush:js" title="検証">
      test :function () {
      var j = 100;
      for (var i = 0; i < j ; i++){
        console.log(i);
      }
    }
    </pre>
    </div>
    <div class="scrn"></div>
    <div class="load"></div>
    </div>

    <!-- 画像  -->
    <div id="waku3">
    <div class="main">
    <img class="photo01" height="358" width="540" src="画像">
    </div>
    <span class="tag"><span id="tagtxt">タグ名</span></span>
    <div class="scrn"></div>
    <div class="load"></div>
    </div>
    
CSSは多少長いです
画像はサイズ指定必須です
各セレクタのpositionがポイントです
/*通常の文章*/
    #waku1 {
      position: relative;
      width: 300px;
      height: 100px;
      border: solid 1px;
      border-radius: 5px;
      -moz-border-radius: 5px;
      -webkit-border-radius: 5px;
      -khtml-border-radius: 5px;
    }
/*Syntaxhighlighter*/
    #waku2 {
      position: relative;
    }
/*画像*/
    #waku3 {
      position: relative;
      width: 553px;
      height: 373px;
      top:5px;
    }
    
/*loadingしたい場所*/
    .main {
      display: none;
      width: 100%;
      height: 100%;
    }
/*半透明枠*/
    .scrn {
      width: 100%;
      height: 100%;
      background-color: black;
      opacity: 0.4;
      margin-top: 5px;
      user-select: none;
      position: absolute;
      bottom: 0px;
      border-radius: 5px;
      -moz-border-radius: 5px;
      -webkit-border-radius: 5px;
      -khtml-border-radius: 5px;
    }
/*ローディング画像用*/
    .load {
      width: 100%;
      height: 100%;
      background: url("loading画像") 50% 50% no-repeat;
      position: absolute;
      bottom: 0px;
    }
/*画像のタグ*/
    .tag{
      position: absolute;
      right: 0px;
      top: 20px;
      background-color: black;
      color: white;
      padding: 2px 15px;
      font-size: 13px;
      box-shadow: 5px 5px 20px rgba(20, 20, 20, 0.5);
    }
    
jQueryを使用してます。
表示したい内容をフェードインして
不要なものをフェードアウトするだけなので短いものです
    window.onload = function () {
      $(".main").fadeIn(2000);
      $(".scrn").fadeOut(2000);
      $(".load").fadeOut(2000);
    }
    
safariは未確認ですがたぶん動作すると思います

2015年6月25日木曜日

ブラウザのアイコンをHTML上でグレースケールにしたりしてみる

ブラウザ毎に動作する、しないを
アイコンをグレースケールにして表現したかったので
やってみました
チェックを操作すると動きます
SAMPLE



上段
    IE:×動作せず
    Firefox:×は2回目以降グレースケールにならない。なぜかは不明
    Chrome:動作します
    safari(iOS)はアップするまで見れる環境無し・・
下段
    IE:動作します
    Firefox:動作します
    Chrome:動作します
    safari(iOS)はアップするまで見れる環境無し・・
違いは・・?
上段はブラウザ毎に1つずつアイコンがあり
cssでグレースケールで変色させてます
それに対し下段は1枚の画像の中にカラーとグレースケールがあり
cssでその座標の一部を表示しています
↓このような1枚の画像です
ではコードです。
    
    <span></span>
    <span></span>
    <span></span>
    <span></span><br />
    
    <div id= "c2"></div>
    <div id= "f2"></div>
    <div id= "i2"></div>
    <div id= "s2"></div>
    
    
    #c1 {
      filter: url("data:image/svg+xml;utf8,#grayscale");
      filter: gray;
      -webkit-filter: grayscale(100%);
    }
    
    #f1 {
      filter: url("data:image/svg+xml;utf8,#grayscale");
      filter: gray;
      -webkit-filter: grayscale(100%);
    }
    
    #i1 {
      filter: url("data:image/svg+xml;utf8,#grayscale");
      filter: gray;
      -webkit-filter: grayscale(100%);
    }
    
    #s1 {
      filter: url("data:image/svg+xml;utf8,#grayscale");
      filter: gray;
      -webkit-filter: grayscale(100%);
    }
    
    #c2 {
      background-image:url("1枚画像のURL");
      width:32px;
      height:32px;
      float: left;
    }
    #f2 {
      background-image:url("1枚画像のURL");
      width:32px;
      height:32px;
      float: left;
      margin-left: 3px;
    }
    #i2 {
      background-image:url("1枚画像のURL");
      width:32px;
      height:32px;
      float: left;
      margin-left: 3px;
    }
    #s2 {
      background-image:url("1枚画像のURL");
      width:32px;
      height:32px;
      margin-left: 3px;
      float: left;
    }
    
    //チェックボタン押下時処理
    function oncheck(){
      var chromef = (document.getElementById("chk-chrome").checked);
      var firefoxf = (document.getElementById("chk-firefox").checked);
      var ief = (document.getElementById("chk-ie").checked);
      var safarif = (document.getElementById("chk-safari").checked);
      fncBrowserIco(chromef,firefoxf,ief,safarif);
    }
    //メイン処理
    // chrome1 firefox1 ie1 safari1は上段用処理
    // chrome2 firefox2 ie2 safari2は下段用処理
    function fncBrowserIco(chromef, firefoxf, ief, safarif) {
        var chrome1 = $('#c1');
        var chrome2 = $('#c2');
        var firefox1 = $('#f1');
        var firefox2 = $('#f2');
        var ie1 = $("#i1");
        var ie2 = $("#i2");
        var safari1 = $("#s1");
        var safari2 = $("#s2");
        if (chromef === true) {
          chrome1.css({filter: 'none','-webkit-filter': 'grayscale(0%)'});
          chrome2.css('background-position', '0px 0px');
        } else {
          chrome1.css('url("data:image/svg+xml;utf8,#grayscale")');
          chrome1.css({filter: 'gray' , '-webkit-filter': 'grayscale(100%)'});
          chrome2.css({'background-position': '0px -32px'});
        }
        if (firefoxf === true) {
          firefox1.css({filter: 'none','-webkit-filter': 'grayscale(0%)'});
          firefox2.css({'background-position': '96px 0px'});
        }else{
          firefox1.css('url("data:image/svg+xml;utf8,#grayscale")');
          firefox1.css({filter: 'gray','-webkit-filter': 'grayscale(100%)'});
          firefox2.css({'background-position': '96px 32px'});
        }
        if (ief === true) {
          ie1.css({filter: 'none','-webkit-filter': 'grayscale(0%)'});
          ie2.css({'background-position': '64px 0px'});
        }else{
          ie1.css('url("data:image/svg+xml;utf8,#grayscale")');
          ie1.css({filter: 'gray','-webkit-filter': 'grayscale(100%)'});
          ie2.css({'background-position': '64px 32px'});
        }
        if (safarif === true) {
          safari1.css({filter: 'none','-webkit-filter': 'grayscale(0%)'});
          safari2.css({'background-position': '32px 0px'});
        }else{
          safari1.css('url("data:image/svg+xml;utf8,#grayscale")');
          safari1.css({filter: 'gray', '-webkit-filter': 'grayscale(100%)'});
          safari2.css({'background-position': '32px 32px'});
        }
      }
      
    //初回は全部グレースケールとする
    fncBrowserIco(false, false, false, false);
    
個人的に下段のほうが良いです。
画像が1枚で済む上、最近のブラウザならほぼ大丈夫でしょう
下段だけの処理だとコードが少ないです。
上段はfirefox用のグレースケール処理の「url("data:image・・・」が長すぎるんですけどね
他にもそもそもグレースケールしたアイコンを用意しておく手もあります
そっちのが楽かもしれませんが、やはり早いので1枚画像のが好みです

2015年6月20日土曜日

Google Apps ScriptでGmaiのアドレス帳のメールアドレス予測変換をする入力欄を作ってみる

GMAILメールアドレス予測をする入力欄を作ってみたので
サーバ側はコード.gs(GAS)でやります
chrome、firefoxは動作しますがIEはダメでした
safariは未確認です
佐藤やら山田等の名前 gmail やらのアドレスの一部などを入力して見て下さい
※jquery.min.js,jquery-ui.min.js,jquery-ui.cssを使用します。
んー、、投稿直後ってjqueryなどの読み込み動かないっぽいです?   
ロード時の処理を書いてしまったのが影響してました   
とりあえず動くようになったと思います。
SAMPLE
×
×

以下コードです
HTMLから
  <div id="jquery-ui-autocomplete" class="ui-widget">
    <label for="jquery-ui-autocomplete-label">To:</label>
    <input id="mailto">
    <span id="close1" class="close" title="Close" onclick="adclear(1)">×</span>
    </input><br />
    <label for="jquery-ui-autocomplete-label">Cc:</label>
    <input id="mailcc">
    <span id="close2" class="close" title="Close" onclick="adclear(2)">×</span>
    </input><br />
  </div>
  
span行は無くてもいいですが、×をつけたかったのでつけてます

CSSです。×ボタンが要らない場合は
21行目から不要です
    .ui-autocomplete {
      max-height: 200px;
      overflow-y: auto;
      overflow-x: hidden;
      font-size: 15px;
    }
    #jquery-ui-autocomplete label {
      float: left;
      margin-right: 5px;
      margin-top: 8px;
      color: black;
      font-size: 15px;
    }
    #mailto,#mailcc {
      margin-left: 5px;
      font-size: 15px;
      width: 350px;
      font-family: 'Noto Sans Japanese', sans-serif;
      margin-top: 5px;
    }
    #mailto:hover + .close,#mailcc:hover + .close {
      display: inline-block;
    }
    .close {
      display: none;
      background-color: #848484;
      border-radius: 50%;
      color: white;
      cursor: pointer;
      font-size: 12px;
      height: 16px;
      line-height: 16px;
      text-align: center;
      top: 0px;
      position: relative;
      right: 20px;
      width: 16px;
    }
    .close:hover {
      display: inline-block;
    }
  
まずhead内のjavascriptで必要なものをロードします
      <script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
      <link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1/themes/smoothness/jquery-ui.css" />
      <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js"></script>
  
メインのjavascriptです
    <script type="text/javascript">
    var ArrData = new Array;
    //×押下時 内容クリア
    function adclear(prm) {
      switch (prm) {
      case 1:
        document.getElementById('mailto').value = "";
        break;
      case 2:
        document.getElementById('mailcc').value = "";
        break;
      case 3:
        break;
      }
    }
    $(function () {
        //アドレス取得
        google.script.run.withSuccessHandler(onSuccess)
        .withFailureHandler(onFailure) .getContact();

        function onSuccess(result) {
          for (var i = 0; i < result.length; i++) {
            var num = ArrData.push(result[i]);
          }
          var word = [];
          for (var i = 0; i < ArrData.length; i++) {
            word.push(String(ArrData[i]));
          }
          var pin = word;
          $("#mailto").autocomplete({
            source: pin
          });
          $("#mailcc").autocomplete({
            source: pin
          });
        }
      },

      function onFailure(e) {
        alert("連絡先にアクセス失敗しました");
      }
    );
  </script>
  
最後にサーバ側gsです。アドレス帳の取得が主な処理です。
    function doGet(e) {
      try{
        return HtmlService.createHtmlOutputFromFile('index');
      }catch(err){
      }
    }

    function getContact() {
      var wadress = new Array;
      var con = ContactsApp.getContacts();
      for(var i = 0;i < con.length;i++){
        var name = con[i].getFullName();
        var emails = con[i].getEmails();
        for (var j in emails) {
            var num = wadress.push(name + "(" + emails[j].getAddress() + ")");
        }
      }
      return wadress;
    }
  
×ボタンのクリア方法などはもうちょっと工夫するとswichとかいらないですが
面倒だったのでこのまま;
あとは要素の追加削除を加えれば
どんどんアドレスを追加していけるような入力欄も作れるかも?

2015年6月19日金曜日

divのidにむけてLoading表示をしてみる

指定のdivのidにむけてLoadingアイコン表示をやってみたので備忘です
サンプルが昨日は動作しなかったんだけど、今日同じコードを書くととちゃんと動いてますね。。謎だ。。

SAMPLE


吾輩は猫である。名前はまだ無い。
どこで生れたか頓(とん)と見當がつかぬ。
何でも薄暗いじめじめした所でニヤーニヤー泣いて居た事丈は記憶して居る。
吾輩はこゝで始めて人間といふものを見た。
然(しか)もあとで聞くとそれは書生といふ人間中で一番獰悪(だうあく)な種族であつたさうだ。
此書生といふのは時々我々を捕(つかま)へて煮て食ふといふ話である。
然し其當時は何といふ考(かんがへ)もなかつたから別段恐しいとも思はなかつた。
但(たゞ)彼の掌(てのひら)に載せられてスーと持ち上げられた時何だかフハフハした感じが有つた許(ばか)りである。
掌の上で少し落ち付いて書生の顔を見たのが所謂(いはゆる)人間といふものゝ見始(みはじめ)であらう。
此時妙なものだと思つた感じが今でも殘つて居る。第一毛を以て装飾され.....

次はsyntaxhighlighterにLoading表示
    function hogehoge() {
      var hoge = "hongeee";
      return hoge;
    }
    function hoghog3() {
    var hoge1 ="";
    var hoge2 ="";
    var hoge3 ="";
    var hoge4 ="";
    var hoge5 ="";
    }
    
まず文章部分のコードです。
    <!--文章部分-->
      <div id="loading1"></div>
      <div id="container1" style="border-style:solid; border-width:2px; border-color:#ddd;">
        吾輩は猫である。名前はまだ無い。<br>
        どこで生れたか頓(とん)と見當がつかぬ。<br>
        何でも薄暗いじめじめした所でニヤーニヤー泣いて居た事丈は記憶して居る。<br>
        吾輩はこゝで始めて人間といふものを見た。<br>
        然(しか)もあとで聞くとそれは書生といふ人間中で一番獰悪(だうあく)な種族であつたさうだ。<br>
        此書生といふのは時々我々を捕(つかま)へて煮て食ふといふ話である。<br>
        然し其當時は何といふ考(かんがへ)もなかつたから別段恐しいとも思はなかつた。<br>
        但(たゞ)彼の掌(てのひら)に載せられてスーと持ち上げられた時何だかフハフハした感じが有つた許(ばか)りである。<br>
        掌の上で少し落ち付いて書生の顔を見たのが所謂(いはゆる)人間といふものゝ見始(みはじめ)であらう。<br>
        此時妙なものだと思つた感じが今でも殘つて居る。第一毛を以て装飾され.....<br>
      </div>
    <!--syntaxhighlighter部分-->
      <div id="loading2"></div>
        <div id="container2">
          <pre class="brush: js;">
            function hogehoge() {
              var hoge = "hongeee";
              return hoge;
            }
            function hoghog3() {
            var hoge1 ="";
            var hoge2 ="";
            var hoge3 ="";
            var hoge4 ="";
            var hoge5 ="";
            }
          </pre>
        </div>
    
HTML部では loadingとcontainerのidを持つdivを必ず準備して下さい
    /* 文章部分 */
    #container1{
      display:none;
    }
     #loading1{
      position:absolute;
      display: inline-block;
      background: url("301.GIF") 50% 80% no-repeat; /*画像は用意してください*/
      left: 0;
    }
    
    /* syntaxhighlighter部分 idが違うだけです */
    #container2{
      display:none;
    }
     #loading2{
      position:absolute;
      display: inline-block;
      background: url("301.GIF") 50% 80% no-repeat; /*画像は用意してください*/
      left: 0;
    }
    
    //Jquery必須
    
      
    
    
JavaScriptではgifを表示する場所の指定とフェードアウトと表示したい内容をフェードインします。
ちなみに上記のコードサンプルにはブラウザの幅や高さを変更した時の処理を書いていません。


2015年6月14日日曜日

テキストファイルをjavascriptで読み込む

ローカルのテキスト(shift-jis)ファイルを
html上で使用することがあったのでメモ

まずはファイル選択ができるHTMLを作成します。
    <head>
    </head>
    <body>
    <input id="file" type="file" value="ファイル選択" />
    <div id ="finfo"></div>
    <div id ="result"></div>
    </body>
    
次にFileAPIを使います。対応しているブラウザじゃないと動きませんが
chrome、FireFoxあたりは動作確認しました

サンプルコードでは選択可能ファイルは1つだけです
shift-jis以外の場合は8行目の'Shift-Jis’を変更してください
デフォルトUTF-8です
ファイル選択ボタンからファイル選択するとすると 変数outputにファイル内容が格納されます
<script>
document.querySelector("#file").addEventListener('change', function(e) {
  // File APIを利用できるかをチェック
  if (window.File) {
    var input = document.querySelector('#file').files[0];
    var reader = new FileReader();
    // ファイルの内容をテキストとして取得
    reader.readAsText(input, 'Shift-Jis');
    reader.addEventListener('load', function(e) {
      var output = reader.result;
      if (output === null){
        output = "";
      }
      var header = "[FileName] :" + input.name;
      header +="[size]" + input.size + "bytes";
      document.querySelector("#finfo").innerHTML = header;
      document.querySelector("#result").innerHTML = escbr(output);
      }
    }, true);
  }
}, true);

//HTMLエスケープと改行
function escbr(str) {
return str
        .replace(/&/g, '&amp;')
        .replace(/</g, "&lt;")
        .replace(/>/g, "&gt;")
        .replace(/"/g, '&quot;')
        .replace(/'/g, '&#039;')
        .replace(/\r?\n/g, "<br />");
}
</script>
  

SAMPLE

エンコード:

ここにファイルをドロップ
【結果】

2015年6月10日水曜日

Google Apps Scriptでキャッシュを使ってみる

Google Apps Scriptのキャッシュが
簡単に使えそうだったのでやってみました


種類は以下の3種類のようです。
違いはリンク先のリファレンスで確認してください
  • getDocumentCache()
  • getScriptCache()
  • getUserCache()
  • ───────────────────────────
    ちなみにgetPublicCache() は今後は使用不可になるのかな?
    リファレンスのサンプルコードにはまだ載ってますし使用可能でした

    下記のサンプルはREDというキーから
    Appleというデータをキャッシュから取得します
    キャッシュにデータがあればそのままログ出力し
    なければキャッシュに保持するというものです
    var cachedata = CacheService.getScriptCache();
    function myFunction() {
      var key = "RED";
      //cachedata.remove(key); //キャッシュ削除
      
      var sbuf = suna_cache.get(key);
      if (sbuf === null){
        //キャッシュに無いから保持
        sbuf = "Apple";
        suna_cache.put(key,sbuf);
      }
      Logger.log(sbuf);
     
    }
    //関数でもいいけどなんとなくクラス的なものにした
    var suna_cache = {
      put: function(key,data){
        cachedata.put(key,data,60*60*24); //24時間保持します。7日間が最大?のようです。
      },
      get: function (key){
         return cachedata.get(key);
      }
    };
      
    時間内はずっと使える連想変数みたいですね
    getDocumentCache()を使用してSpreadSheetに変化が少ないマスタのような
    データを保持している場合などは
    非常に有効になるんじゃないでしょうか
    たぶん配列で入るのか・・な?やったことないので時間があればやってみたいと思います
    キャッシュは便利な反面、バグを含んだままキャッシュに保持すると
    時間内はキャッシュがクリアされない限りバグったままになるので
    取り扱いは注意が必要です

    2015年6月8日月曜日

    Google Apps Script[GAS]で天気情報取得

    天気情報取得は公開されているAPIを使用します。
    まずどこのAPIを使うのかを決めます。
    無料かつJSON(P)で取得可能なところを探しました。
    使用する場合はライセンスは各自で調べてください
  • OpenWeatherMap OpenWeatherMap
    POINT 概況や降水確率がないが緯度経度で取得可能、海外でも取得可能なのが良い。緯度経度の有効桁は少数2桁まで。
    JSONが変にまとめられていて個人的に凄い微妙に感じる

  • weather_hacks weather_hacks(LiveDoor)
    POINT 緯度経度での情報や降水確率はないが概況やアイコンがこの中では良い。
    データの中に「今日」等があり、気が利いてる

  • OpenWeatherMap drk7jp
    POINT 緯度経度での取得はないが、降水確率があるのは大変ありがたい

  • 他にも・・・
    YahooはアプリケーションIDが必要。情報が微妙だった気がします。
    MSNはなくなってたり降水確率などもあったようです。(まだ使用可能そうですが、てかJSONではないです)
    好みのやつを選択すればいいと思いますが、複数サイトからの取得もありかと思います。

    以下はGoogle Apps Scriptのサーバサイドでの取得方法です
    することはほぼ同じですね~
        //units=metricで華氏から摂氏へ変更
        var url = "api.openweathermap.org/data/2.5/weather?units=metric&q=Tokyo,jp";
        result = UrlFetchApp.fetch(url);
        var retw = result.getContentText();
        var retjson = JSON.parse(retw);
        Logger.log(jsonresult.weather);
      
        var url = "http://weather.livedoor.com/forecast/webservice/json/v1?city=400040";
        result = UrlFetchApp.fetch(url);
        var retw = result.getContentText();
        var retjson = JSON.parse(retw);
        Logger.log(jsonresult.forecasts[0].telop);
      
        var url="http://www.drk7.jp/weather/json/23.js";
        result = UrlFetchApp.fetch(url);
        var retw = result.getContentText();
        //余分なものを除去してから
        retw = retw.replace(/drk7jpweather.callback\(/g,"");
        retw = retw.replace(/\);/,"");
        var jsonresult = JSON.parse(retw);
        Logger.log(jsonresult.pref.area.南部.info[0].weather);
      
    以上です。
    あとはガジェットにしたり、定時にメールしたり、つぶやいたりも可能かと思います。

    2015年6月6日土曜日

    syntaxhighlighterでのautoloader使用時の問題

    以前、HTMLと他言語をsyntaxhighlighterで表示する方法
    を投稿しましたがshAutoloader.jsを使用した場合に
    syntaxhighlighter表示にならず、かなりハマりましました・・・

    ならばautoloaderを使用しないようにしたら良いのですが
    こちらは多数のshBrush.jsを使用する場合に重かったり
    以前のIEでの表示問題があるようですね

    しかしshBrush.jsは今のとこ4種類くらいしか使わない、IE11では動作してた
    もうすぐEdgeだろう?などの理由でとりあえずautoloaderやめました

    そのうち公式で修正が当たんないかなぁ~;

    Google Apps ScriptのGmailガジェット作成.2

    【HogeGmail.html】の続きです
  • JavaScript
  • ポイントはsetTimeoutによる1秒後にメール取得
    HTML表示と同時に行うとどうしても遅い感じを与えるため
    アイコン表示が終わって一呼吸後に未読件数を表示することによって軽減してます。
    <script>
    //初期処理(未読メール表示
    function fncGetMail() {
        setTimeout(function () {
            // 1秒後に表示
            google.script.run.withSuccessHandler(onSuccess)
                .withFailureHandler(onFailure).getMail();
        }, 1000);
    }
    //呼び出し
    fncGetMail();
    
    //メールデータ取得成功
    function onSuccess(result) {
        var html = '';
        try {
            var iCnt = parseInt(result['count']);
            if (iCnt > 99) {
                iCnt = 99;
            }
            if (iCnt > 0) {
                html += '<div class="icon">'
                html += '<div class="badge">'
                html += '<span class="inner">' + (iCnt) + '</span>'
                html += '</div>'
            }
            document.querySelector('#CntRep').innerHTML = html;
        } catch (e) {
            alert(e.message);
        }
    }
    //メールデータ取得失敗(再読込みとする)
    function onFailure(error) {
        location.reload();
    }
    //再読込み
    function doReload() {
        google.script.run.withSuccessHandler(onSuccess)
            .withFailureHandler(onFailure).getMail();
    }
    </script>
    
  • Google Apps Scriptのエディタ画面でソースを保存し
    ファイル>版を管理>新しいバージョンを保存
  • 公開します
    公開>ウェブアプリケーションとして導入
    出てきた子画面の公開するプロジェクトバージョンを先ほど作ったバージョン番号を指定
    「次のユーザーとして...」はウェブアプリ...ユーザーを選択
    アクセスできるユーザーはどれでもいいです。


    この時URLをコピーしておきましょう
  • 作成したサイトでページ編集ボタンを押します
    挿入>Apps Script


    下枠の入力ボックスに先ほどコピーしたURLを貼り付けて選択ボタンを押します


    ガジェットの保存とページの保存を行います
    最後にサイトへ表示させるために承認が必要です。
    ガジェットを配置した場所にボタン表示があるので押して承認しページをリロードしてください
    表示されているはずっ

    2015年6月5日金曜日

    Google Apps ScriptのGmailガジェット作成.1

    Google SitesにGmail表示を行いたい
    けど公開されているガジェットが動作しない・・
    そこで前回のGmailの取得を利用して(前回はこちら) Google SitesのGmailの未読の有無がわかるガジェットを作成します。

    ようは↑iOSでよくみるバッジ(バッヂ?)的のを作ります

    【準備】
  • Google サイトを作成しておいて下さい
  • Google ドライブにGoogle Apps Scriptアプリを追加して下さい
    ※下図は既に追加されています

  • Google Apps Scriptを新規作成
    Google ドライブ>新規>その他>Google Apps Script
  • 「空のプロジェクト」を選択します
  • ファイル>新規作成>HTMLファイルを選択
  • ファイル名を入れてOKボタンを押します

  • ここでは「HogeGmail」にしました

    【コード.gs】
  • まず先ほど作成したHTMLをdoGetで呼び出します
  • function doGet(e) {
      return HtmlService.createHtmlOutputFromFile('HogeGmail');
    }
    
  • メール取得を関数化しておきます
    前回投稿とほぼ同じですが最低限にしてます
  • function getMail(){
      var datReturn =new Object();
      try{
      //スレッド数
      var thds = GmailApp.search("is:unread", 0, 100);
      //未読件数
      var i = 0;
      var cFrom;
      var searchchar = Session.getActiveUser().getEmail();
      for(var n in thds){
        var thd = thds[n];
        var msgs = thd.getMessages();
        for(m in msgs){
          var msg = msgs[m];
          cFrom =msg.getFrom();
          //自分が出した返信メールは除外する。
          var searchidx = cFrom.search(searchchar);
          if (searchidx <= 0 && msg.isUnread() === true){
          i++;
          }
        }
      }
      datReturn['count'] = i;
      return(datReturn)
      } catch(err){
       Logger.log(err)
       datReturn['count'] = 0;
       return(datReturn)
      }
    }
    
    コード.gsはこれで終わりです!

    【HogeGmail.html】
    以下は必要に応じて調整が必要
  • CSS
  • td {
    text-align: center;
    }
    .title {
    font-size:11px;
    margin:0;
    padding: 0;
    line-height:1em;
    }
    .wrapper {
      overflow: hidden;
      line-height:1em;
    }
    .icon .badge {
      position: absolute;
      top: 1px;
      left: 25px;
      width: 20px;
      height: 20px;
      border-radius: 50%;
    }
    .icon .badge .inner {
      display: block;
      position: relative;
      margin: 1px;
      font-size:12px;
      width: 18px;
      height: 18px;
      border-radius: 50%;
      color: #fff;
      line-height: 19px;
      text-align: center;
      /* FLAT */
      background:#FE2E64;
    }
    
  • body内HTML
  • 各自アイコンは準備してください
    ここではアイコンサイズは32pxですが、cssを弄ればいろんなサイズ対応は可能です。
    <body onLoad="setInterval('doReload()',1000*60*15)">
      <div id="icondata">
      <table align="left" border="0" cellpadding="5" cellspacing="1">
      <tbody>
      <tr>
      <td>
      <div class="wrapper">
      <a href= "https://mail.google.com/mail/u/0/#inbox" target="_blank">
      <img src="../googlemail-32.png">
      
      <div id="CntRep"></div>
      <div class="title">Gmail</div>
      </a>
      </div>
      </td>
     </tr>
      </tbody>
      </table>
      </div>
    </body>
    
    一旦ここまでとします。
    あとはJavaScriptとガジェットへの追加方法となりますが
    次回の投稿とします。

    2015年6月3日水曜日

    Google Apps ScriptでGmail取得してみる

    ちょっと趣向を変えてGoogle Apps Script(以下:GAS)について
    Google Sitesをいろいろ触る機会がありました。
    しかし Gmailを見るガジェットが見当たらなかったので
    未読メールを取得したときの備忘です

    ちなみにCodeはコード.gsなどに記載するものです。

  • スレッド取得方法1
  • //inboxから1件目から最大500件取得してきます
    var thds = GmailApp.getInboxThreads(0,500);
    
  • スレッド取得方法2
  • var thds = GmailApp.search("is:unread", 0, 500); 
    
    ※スレッドは最大500件ほどしか取得できないようです

    取得方法1はめっちゃ重く、
    比べて取得方法2はめっちゃ速いです
    これは用途の違いかと思います

    取得方法1は最初の直近のスレッドを30件ずつ取得して
    操作が入った場合に次の31件~60件を取得するやり方であり
    未読既読関係なくスレッドを順に見ていく分には適したものと思います

    取得方法2は条件付きでスレッドを取得します
    当たり前ですが未読情報が少なければ速くなります
    今回の用途は未読分だけを表示なので取得方法2で行うほうがいいということです

    ちなみに取得条件(今回は is:Unread の部分)はブラウザのGmail検索ボックスで指定可能なもの使用できそうです
    あとはスレッド分ループしてメッセージを取得します。
      var oReturn =new Object();
      var i = 0;
      var cFrom, cTo, cDate, cSub, cMsgid, cThdurl
      for(var n in thds){
        var thd = thds[n];
        var msgs = thd.getMessages(); 
        cThdurl = thd.getPermalink(); //メッセージへのLinkURL取得
        for(m in msgs){
          var msg = msgs[m];
          cFrom =msg.getFrom();
          //自分が出した返信メールも未読にカウントされているので除外する
          var searchchar = Session.getActiveUser().getEmail();
          var searchidx = cFrom.search(searchchar);
          if (searchidx <= 0 && msg.isUnread() == true){
          cTo = msg.getTo();
          cDate = Utilities.formatDate(msg.getDate(),'JST','yyyy-MM-dd HH:mm:ss');
          cSub = msg.getSubject();
          cMsgid = msg.getId();
          oReturn['from' + i] =cFrom;
          oReturn['to' + i] = cTo;
          oReturn['date' + i] = cDate;
          oReturn['subject' + i] = cSub;
          oReturn['msgid' + i] = cMsgid;
          oReturn['url' + i] = cThdurl;
          i++; //←件数をカウント
          }
        }
      }
      oReturn['count'] = i; //←件数
    
    上記以外にもGASにはできることが多数あるので リファレンス 辺りを調べれば幸せになれると思います

    syntaxhighlighter htmlとの混合記載など

    よく忘れそうな記載方法
    ・htmlと他言語の混合での表示
    <pre class="brush: js; html-script: true">
    <boby>
    <div>Hi!</div>
    </body>
    <scrpit>ほげほげ</script>
    </pre>
    
    ・タイトル部表示方法
    <pre class="brush: js;" title="タイトル" >
    </pre>
    

    2015年6月2日火曜日

    引き続きsyntaxhighlighterのCSS調整まとめ

    1. Mobileブラウザで表示崩れを補正
    2. safariなどで行番号が消えてたりするのを改善します
      .syntaxhighlighter {
        /*safariで行番号が消えるのを修正*/
        -webkit-text-size-adjust: 100%;
      }
      
    3. 縦スクロール表示無し
    4. 縦スクロールは邪魔と思ったので消します。
      .syntaxhighlighter {
       /* 縦スクロール非表示 */
        overflow-y: hidden !important;
      }
      
    5. 表示枠線調整
    6. .syntaxhighlighter table {
        /* 表示枠の線種 線色と線の太さ調整 */
        border:solid 1px #EEE !important;
      }
      
    7. IE用調整
    8. /* 元々はこれ
       .syntaxhighlighter.ie {
        font-size: .9em !important;
        padding: 1px 0 1px 0 !important;
      } を以下のように変更 */
      .syntaxhighlighter.ie {
        /*IEフォントサイズ*/
        font-size: 1em !important;
        /*IE横スクロール対策*/
        padding: 0 0 1.4em !important;
      }
      
    9. はみ出し対策
    10. 横に長いCodeが枠外へ突き抜けるのを防止
      .syntaxhighlighter .line.alt1 {
        word-break: break-all !important;
      }
      .syntaxhighlighter .line.alt2 {
        word-break: break-all !important;
      }
      
    11. 奇数行の背景色変更
    12. 行の見通しよくします
      .syntaxhighlighter .line.alt2 {
        background-color: #F8F8F8 !important;
      }
      /*偶数行の背景色は以下*/
      .syntaxhighlighter .line.alt1 {
        background-color: white !important;
      }
      
    13. タイトル枠の表示調整
    14. .syntaxhighlighter table caption {
        color: white !important;
        background-color: #848484 !important;
        line-height: 0.50em !important;
        font-size: 12px !important;
        margin-left:2em;
      }
      

    Bloggerでsyntaxhighlighter表示してみた

    1. syntaxhighlighter version 3.0.83をdownload
    2. 落としてきたzipを解凍する
    3. 必要なcss(stylesフォルダ内の最低1つ以上)
    4. 必要なjs(scriptsフォルダ内)
      • shCore.js(必須)
      • shAutoloader.js(任意だが今回の例では必要)
      • shBrushJScript.js(任意) 他にもcss php sql vb perl delphiと色々あるが必要分だけでok
    5. cssとjsをGoogleDriveにUpload
      (他にもupload先はGoogle Apps Site等でも可能そうですがとりあえず)
    6. uploadしたファイルを共有します(オン・ウェブ上で一般公開)

    Bloggerのテンプレートをhtmlで編集します。
        <head>の上部に記載(他のCSSより上)
    
    <head>
    
    
    
    </head>
    
        </body>の直前に記載
    
    
    </body>
    
    Bloggerのテンプレート保存をします
    これでとりあえず完了です
    あとは以下のようにhtmlコードを投稿してみます
    <pre class="brush:html;" title="htmlサンプル">
    <head>
    <title>ほげほげ</title>
    </head>
    <body>
    
    </body>
    </pre>
    
    classの値をbrush:js とすればJavaScriptでの表示になります
    あとはuploadしたcssを細かく調整していくのみです
    これが大変でした。。