ラベル JavaScript の投稿を表示しています。 すべての投稿を表示
ラベル JavaScript の投稿を表示しています。 すべての投稿を表示

2014年7月2日水曜日

Google Apps Script : 指定範囲内の整数からランダムに1つ選ぶ方法

使う機会が多いか少ないかはわかりませんが、今作っているツール(こちらで作成を始めたツールとほぼ同じ機能をもの)に自分の意図とは関係なく、無作為にデータを選んで表示させたい部分があったので、Google Apps Scriptではどのような書き方するのか調べてみました。

結果は、JavaScriptの関数を使う、です。

JavaScriptのMathクラスのrandom()関数を使うと、0以上1未満の小数を得られます。これを使って指定範囲内の整数をランダムに1つ得るには、指定の範囲を0~99とすると

var random = Math.floor(Math.random() * 100);

となります。random()で得られるのは0以上1未満の小数なので、100をかけることで0以上100未満の小数が得られます。

floor()は小数点以下の切り捨てるときに使いますので、0以上100未満の小数の小数点以下を切り捨てることで、0~99までの100個の整数を無作為に得ることができます。

参考にさせていただいたサイトはこちら

2014年6月26日木曜日

Google Apps Script : セルから取得した値を四捨五入する

Google Spreadsheetのセルから取得した値を整数に変換する方法はJavaScriptの関数を使う方法がいくつかあるようなのですが、ここでは四捨五入して整数にするとします。その場合の記述方法は、

var 変数名 = Math.round(sheet.getRange(セル指定).getValue());

こちらに値の切上げや切り下げを含む他の方法での整数への変換方法が記載されています。

2014年6月24日火曜日

Google Apps Script : 特定の列内の複数の値を並び替える

もちろん列ではなく行の場合でも同じ方法で値を並び替えた配列を取得できます。

書き方は、

配列名.sort();

下のサイトで教えていただきました。ありがとうございます。

配列を逆順(降順)にソートする(JavaScript)



Google Apps Script : 特定の列内の最大値を取得する

とりあえず書き方だけ。

D列の1行目から最終行までの値を1つの配列に入れ、その配列内の最大値をJavaScriptのメソッドを使って取得するようです。

---以下スクリプト---

function getMaxValue() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getActiveSheet();
    var last_row = sheet.getLastRow();
    var columnD = sheet.getRange(1,4,last_row);
    var valuesD = columnD.getValues(); //D列の値が入った配列
    
    Browser.msgBox(Math.max.apply(null,valuesD));
}

---以上スクリプト---

下のサイトから頂戴しました。ありがとうございます。

2014年6月20日金曜日

Google Apps Script : 配列の最初から最後までループを回すときの注意点

Google Apps Scriptを使って、自分のGmail受信トレイから特定のラベルを付けたメールの内容をGoogle Spreadsheetに入力するスクリプトを書いていてはまってしまったので、ここに書いておきます。

まず、はまったスクリプトがこちら。

---以下スクリプト---
function getMessageFromGmail() {

    var label = GmailApp.getUserLabelByName("Label name");
    var threads = label.getThreads();
    row = 1;
   
    for(var n=0;n<=threads.length;n++) {
        var thread = threads[n];
        var msgs = thread.getMessages();
       
        for(m in msgs) {
            var msg = msgs[m];
            var date = msg.getDate();
            var from = msg.getFrom();
            var to = msg.getTo();
            var subject = msgs[m].getSubject();
            var body = msgs[m].getPlainBody();
           
            sheet.getRange(row,1).setValue(date);
            sheet.getRange(row,2).setValue(subject);
            sheet.getRange(row,3).setValue(body);
            row = row + 1;
        }
    }
}
---以上スクリプト---

次に、問題が解決したスクリプトがこちら。

---以下スクリプト---
function getMessageFromGmail() {

    var label = GmailApp.getUserLabelByName("Label name");
    var threads = label.getThreads();
    row = 1;
   
    for(var n=0;n<threads.length;n++) {
        var thread = threads[n];
        var msgs = thread.getMessages();
       
        for(m in msgs) {
            var msg = msgs[m];
            var date = msg.getDate();
            var from = msg.getFrom();
            var to = msg.getTo();
            var subject = msgs[m].getSubject();
            var body = msgs[m].getPlainBody();
           
            sheet.getRange(row,1).setValue(date);
            sheet.getRange(row,2).setValue(subject);
            sheet.getRange(row,3).setValue(body);
            row = row + 1;
        }
    }
}
---以上スクリプト---

違いは1箇所。1つめのforループを回す回数を示すn<threads.lengthが、<=か<だけです。基本を分かっている人にはバカにされ笑われてしまいそうですが、独学だとこんなところにはまってしまいます。

このスクリプトでは、まず、

    var label = GmailApp.getUserLabelByName("Label name");
    var threads = label.getThreads();

のところでGmailの受信トレイから"Label name"という名前のラベルの付いたスレッド(配列)を取得して、threadsという名前をつけています。
次に、配列threadsの中身をforループを使って順番に見ていき、n番目のスレッドを

    var thread = thread[n]
    var msgs = thread.getMessages();

としてthreadという名前の変数に入れ、thread(これも配列)の中身をgetMessages()メソッドを使って取りだしてmsgsという名前をつけています。

上の失敗例を実行すると、関数実行中のメッセージがなかなか消えず、消えたと思ったらvar msgs = thread.getMessages();のところでmessagesがgetできないというエラーメッセージが表示されます。

エラーの理由は、上にも書いた通り、forループの繰り返し回数指定にありました。
Google Apps Script (JavaScriptやPythonでも同様)では、配列(Pythonではリスト)のインデックスは0から始まるため、上のスクリプトのように配列の長さをループの繰り返し回数に指定する場合、

for(var n=0;n<=threads.length;n++)

と書くと、配列の長さより1回分多くループを回してしまうことになります。そのため、配列内の長さを超えたところでgetMessages()メソッドを実行使用してエラーとなっていました。

ものすごく単純なことなのですが、先駆者のみなさんのスクリプトのコピペで勉強を始めた身としては、引っかかって良かったと思える失敗でした。

2014年5月23日金曜日

Google Apps Script : parseInt関数を使う場合の注意点

Google Apps ScriptはJavaScriptがベースのため、JavaScriptの関数も使えます。
今回取り上げるのはparseInt関数です。

parseInt("文字列として書かれた数値") // 文字列として書かれた数値を整数に変換する


配列内にある複数のし、その配列の先頭から順に値(文字列)を整数に変換していきますが、先頭が数値でない場合は「NaN」が結果として返ってきます。

Spreadsheetの複数セルの値を配列に入れてこの関数を適用しようとした場合、配列の先頭にくる値は数値である必要があります。

SyntaxHighlighter