Google公式
の勝手翻訳

Google Apps Scriptを始めるのは簡単です。この章ではSpreadsheetのスクリプトギャラリーから既存のスクリプトをインストールして探索していきます。


既成のスクリプトのインストールと実行

一番早くて簡単なGoogle Apps Scriptを使用する方法はGoogle Spreadsheetのスクリプトギャラリーから既存のスクリプトをインストールすることです。これらのスクリプトはGoogle Apps Script チームやユーザーによって作られた公開スクリプトです。

スクリプトギャラリーのスクリプトをインストールして動かすには
  1. グーグルアカウントからグーグルドキュメントを開く
  2. 作成>スプレッドシートを選択
  3. 自動的に保存されるようにスプレッドシートの名前を設定
  4. ツール>スクリプトギャラリーを選択
  5. スクロールしてインストールをクリック。インストールが成功したことが表示される
  6. 閉じるをクリック
  7. ツール>スクリプトマネージャを選択
  8. スクリプトを選択して実行をクリック
  9. もしスクリプトを実行するのにauthorizationを聞かれたら、Authorizeするかキャンセルをクリックして実行を停止する。
  10. 実行をクリックすれば、スクリプトは実行される

株価スクリプトをインストールする

株価情報を取得するスクリプトをインストールしてみましょう。このスクリプトはユーザーのピーターポンが書いたもので彼の許諾の元使用します。グーグルはこのスクリプトには責任を負わないものとします。

株価スクリプトをインストールして実行するには

  1. グーグルアカウントからグーグルドキュメントを開きます
  2. 作成>スプレッドシートを選択
  3. 自動的に保存されるようにスプレッドシートの名前を設定
  4. ツール>スクリプトギャラリーを選択
  5. Stock Price スクリプトを検索してインストールをクリック。インストールが成功したことが表示される
  6. 閉じるをクリック
  7. ツール>スクリプトマネージャを選択。二つの関数がスクリプトリストに見える
  8. どちらかのスクリプトを選んで実行をクリック。authorizationを聞かれる
  9. Authorizeをクリックしてスクリプトを実行、Now you can run the scriptのメッセージが現れる
  10. getStock関数を選んで実行。A1からE1のセルが Symbol,Name, Exchange, Trade Time, Priceで埋まる。それに加えFinanceメニューが現れる。(onOpen関数を実行すると出現)
  11. 何か株シンボルをA2からA列に挿入する(ibm,goog,yhooなど)
  12. Finance>Get Stockを選択。残りのセルが題目の情報で埋められる。



株価スクリプトの概要

最初にスクリプトエディタでスクリプトを開く。ツール>スクリプトエディタをクリックで自動的にロードされる。

スクリプトはonOpen 、getStockという二つの関数を含んでいる。

onOpen関数はスプレッドシートにFiinanceメニューとGet Stockメニューアイテムを加える。スプレッドシートを開いた時にonOpen関数は自動的に実行され、メニューとメニューアイテムを加える。

getStock関数は列に題名を与え、A2からAxセルに置かれた株シンボルを獲得し、株情報を検索して、スプレッドシートにそれを表示する。



株価スクリプトの詳細を見る

ここから株価スクリプトを詳細に見て行こう。onOpen()関数から始めよう。

function onOpen() {
 
var ss = SpreadsheetApp.getActiveSpreadsheet();
 
var menuEntries = [ {name: "Get Stock", functionName: "getStock"}];
  ss
.addMenu("Finance", menuEntries);
}
このコードは、スクリプトをインストールしたスプレッドシートを開いたと同時に実行される。もしスプレッドシートを閉じたり開きなおしたりしたら、スプレッドシートを開いた何秒かあとにFinanceメニューが現れるのがわかると思う。少しばかりの遅れは普通の振る舞いである。

 function onOpen()は関数とその関数名を宣言するコードである。中括弧の間にあるコンピューターコードはonOpen() 関数を実行した時に実行に移されるコードになる。onOpen()関数はスクリプトを含んだスプレッドシートを開いた時に自動的に実行される関数となる。中括弧はこんな感じ{}。(onOpen()がどう動くかの更なる情報はこちらをみてください。Running Scripts in Response to an Event

スクリプトはそれから現在アクティブになってるスプレッドシートのオブジェクトを獲得する SpreadsheetApp.getActiveSpreadsheetメソッドを呼び出す。
スクリプトは変数ssにこのオブジェクトを割当てます。ssのメソッドを呼び出すことによって、スクリプトは実行中のスプレッドシートを操作することができる。
メソッドはクラスと独占的に協調し、そのクラスのオブジェクトのある仕事を実行する。

二番目の行はメニューエントリーのGet Stockを定義し、二番目の関数のgetStock()とメニューエントリーと関係付る。三行目はaddMenu()メソッドをつかってスプレッドシートにFinanceメニューを追加する。

これは二番目の関数、getStock()についてである。この関数はFinance > Get Stockをクリックした時に実行するコードを含んでる。スプレッドシートの列にヘッダーを挿入する。そしてA列に入力したストックシンボルを読み取り、それに対応する情報を引き出して、スプレッドシートにそれを挿入する。

function getStock() {
 
var sheet = SpreadsheetApp.getActiveSheet();

  sheet
.getRange(1, 1).setValue("Symbol");
  sheet
.getRange(1, 2).setValue("Name");
  sheet
.getRange(1, 3).setValue("Exchange");
  sheet
.getRange(1, 4).setValue("TradeTime");
  sheet
.getRange(1, 5).setValue("Price");

 
var row = 2;
 
while (true) {
   
if (!sheet.getRange(row, 2).getValue()) {
     
var symbol = sheet.getRange(row, 1).getValue();
     
if (!symbol) break;
     
Logger.log("Updating symbol: " + symbol);
     
var stockInfo = FinanceApp.getStockInfo(symbol);
      sheet
.getRange(row, 2).setValue(stockInfo.name);
      sheet
.getRange(row, 3).setValue(stockInfo.exchange);
      sheet
.getRange(row, 4).setValue(stockInfo.tradetime);
      sheet
.getRange(row, 5).setValue(stockInfo.price);
   
} else {
     
Logger.log("Already updated: " + symbol);
   
}
    row
++;    
 
}
}

関数が宣言された後var sheet = SpreadsheetApp.getActiveSheet();は現在アクティブなスプレッドシートを獲得し、それをオブジェクトsheetに読み込む。現在アクティブのスプレッドシートとはは常にスクリプトが組み込まれてるスプレッドシートであるということを特筆する。


最初の五行はA1からA5までgetRange()メソッドを使って5つのセルを識別し、setValue()メソッドで対応するセルに列のヘッダーを挿入する。setValue()メソッドではSymbol,Nameとその他ののヘッダー名を引数とする。メソッドにデーターを引き渡すのに引数を使う。データは文字列データを引き渡す。すなわち平文であり、それぞれの引数はクォーテーションで囲まれる。Symbolは株シンボルを引渡し、名前は株の名前を引き渡す。他も同じく。

var row = 2;のラインは変数 row を初期値2で生成する。この変数は反復のカウンターとして使われる。列Aのストックシンボルのリストからそれぞれの行に対してそれぞれの列をそのストックシンボルに対応する情報で埋めていくためのカウンターとしてである。

while (true)ループは列Aにストックシンボルが存在するかどうかとif ループの内部を連続的にテストする為の処理を含む。それぞれのセルの値は変数symbolに読み込まれる。もしその変数が値を持っているならばFinanceAppオブジェクトのgetStockInfo()メソッドがそのストックシンボルに対する社名、市場名、トレーディング時間と価格を獲得するために呼ばれる。そしてsetValue()メソッドがスプレッドシートのそのシンボルの行の適切なセルに情報を書き込むために呼ばれる。そしてコードは更に二番目の列に値があるか確かめる。もし値があるなら、スクリプトは行はすでに更新されているものと想定して、処理をしない。

if (!symbol) break;のコードはsymbol変数にストックシンボルが入ってない場合にwhile ループから抜け出す為のスクリプトのコードである。感嘆符は否定条件を記述していて、それによって値があるかどうかテストして、もし値がないならばそれに対応する分岐へ続く。あなたのスプレッドシートは二行目から八行目までストックシンボルで埋まってるかもしれないとする。それぞれの行に対して、最初の行のテキストをコードは読んでsymbol変数に割り当てる。

もし最初の列にテキストが存在しないならば、symbolは空の文字列を含むことになり、そのループは停止される。その場合意外実行は続けられ、空の行に達するまで行数は加算されていく。その時点に達したなら、breakがループから抜け出すスクリプトを呼び起こし、終了する。

Logger.log("Updating symbol: " + symbol);の記述はスクリプトが実行されるときにそれぞれのストックシンボルに対するログメッセージを記録する。ログメッセージを見るためには、あなたのスプレッドシートからストックシンボル意外のデータを消してスクリプトエディタからスクリプトを実行し、表示 > ログをクリックする。そうするとそれぞれのストックシンボルに対するログメッセージを表示するパネルを見ることができる。



株価スクリプトを改良する

もし株価スクリプトを何回か実行してみたなら、多分以下の一連のイベントを見ることができたと思う。
  1. スクリプトをインストールして実行のためのオーサライズ
  2. ストックシンボルをA2,A3...Anに挿入
  3.  Finance > Get Stock をクリックてスクリプトを実行
  4. スプレッドシートを閉じて、何日後かに開いてみる
  5.  Finance > Get Stockを再びクリック。あなたはすでにデータで埋められたスプレッドシートが現在の情報でアップデートされないことに気がつくだろう。もしストックシンボル意外を消して、Get Stock関数を実行したなら、残りのセルが現在の情報で埋められるのに気がつくだろう。
スクリプトを再実行した時にすべてのセルが更新されるように改良することができる。

スクリプトを改良するため
  1. スプレッドシートを開きスクリプトエディタを開く
  2. 株価スクリプトがスクリプトエディタに開くようにする。もし違うスクリプトが開いているなら、ファイル>開くをクリックして、正しいスクリプトを選択する。
  3. 次のコードをコメントアウトするか、削除する。コメントアウトするには、二つのフォワードスラッシュをそれぞれの行の先頭に記述する。

// if (!sheet.getRange(row, 2).getValue())
    もしコードをコメントアウトしたなら、スクリプトエディタでの色が変わることがわかると思う。

   4. 以下の行をコメントアウトするか削除する。
//      } else {
//      Logger.log("Already updated: " + symbol);
//    }
      5.スクリプトを保存する。次回に Finance > Get Stockを実行した時全てのセルが更新される。もし数分離れてスクリプトを二回実行したなら、
    タイムスタンプが更新されているのがわかると思う。