Pocket

スプレッドシートのセルを操作

前回に引き続きスプレッドシートでXML情報を取得して表形式に出力する方法について。今回は表に出力する編。

セルの操作手順

セルの値を取得したり変更したりする場合、以下のステップを踏みます。

  1. スプレッドシートオブジェクトから対象シートのオブジェクトを取得
  2. 対象シートのセル範囲を指定したオブジェクトを取得
  3. 指定セル範囲の値を取得・変更できる

対象シート→対象セルの順番でオブジェクトを取得してようやくセルへのアクセスが出来る状態になります。

セルにアクセスできるようになるまで

まず最初にSpreadsheetAppClassのgetActiveSheetメソッドで現在開いているシートのオブジェクトを取得します。

次にgetRangeメソッドで値を取得・変更したい対象のセルを指定します。

getRangeメソッドはSheetクラスのメソッドで以下のように設定します。

NameTypeDescription
rowIntegerthe row of the cell to return
columnIntegerthe column of the cell to return

セルA1を指定する場合は、getRange(1, 1)と指定することになります。これで手順は理解したので、XMLデータを取得してセルに表示してみます。

RangeクラスのsetValueメソッドで値をセット

RangeクラスのsetValueメソッドを使って値をセットします。前回のXMLデータから記事タイトルと投稿者をセルに表示してみます。

setValueの実行結果

とれた!\(^o^)/………が何か遅くないか?たかだか20件ぐらいのデータを取得するのに何秒かかるんだ?ちょっと時間計測してみよう。

処理にかかる時間をログに出力してみる。

スクリプトの処理の開始時に現在の日時を取得して変数に保存しておきます。

スクリプト処理に最後にまた現在の日時を取得して、開始時間との差分を計算してログに表示します。

準備完了!いざ実行!

実行にかかった時間

ろ、6.694秒だと……?遅いー!これ100件、1,000件と件数増えたらどんだけ遅いんだ?これはAPIが遅いのか?何か速くする方法はないものか?うーん。

RangeクラスのsetValuesメソッドでまとめて値をセット

RangeクラスにsetValuesという配列の値をまとめてセットするメソッドがありました。これならいけそう。ということで、プログラムの改修。

getRangeメソッドもrow, columnだけの設定でなく、開始行, 開始列, 終了行, 終了列を設定して配列をセットする範囲を指定します。これでまとめて表示できました。計測時間は、6.122秒と少しだけ速くなりましたが、5,000件ぐらいのデータを実際に試してみたら30秒近く差が出ました。ソースコード全文貼り付け。