こんにちは、kadotaです。アクトインディでPCおじさんをしています。
この記事は actindi Advent Calendar 2017 の7日目の記事です。
G Suite (旧Google Apps) を利用している環境では、Google Apps Script (略してGAS) でちょっとした工夫、効率化ができるのがうれしいところだと思います。
今回はGASでスプレッドシートを扱うときに困った状況を解決してくれる魔法の1行を紹介します。
データを専用の外部シートに分けたい
あるシートで、データを別ファイルのシートから読み込んで反映したいときがあります。
こんな例:
// データ取り込み用のシート
var sheetsA = SpreadsheetApp.getActiveSpreadsheet();
var sheetA = sheetsA.getSheetByName("シート名");
var rangeA = sheetA.getRange(startRow, startCol, numRows, numCols);
// 外部シートから取り込み
var dataUrl = 'https://docs.google.com/spreadsheets/d/XXXXXXXXXXXX.../edit#gid=0';
var sheetsB = SpreadsheetApp.openByUrl(dataUrl);
var sheetB = sheetsB.getSheets()[0];
var rangeB = sheetB.getRange(startRow, startCol, numRows, numCols);
// シートBをシートAに反映
rangeA.setValues( rangeB.getValues() );
一部のセルがおかしい…
ふつうはこれでOKなのですが、一部のセルだけ処理をする際におかしなことになることに気付きました。日付や時刻です。
これらが入っているセルを Apps Script で扱う際に、データが Date オブジェクトとして返ってくるせいでした。
セルのデータを表示そのままで取り込む
Date オブジェクトをいちいち整形しなおすしかないのか…?と思いましたが、Range クラスに魔法のメソッドがありました。 setNumberFormat です。
名前こそ number format ですが、日付も扱えます。
これでフォーマットを指定することができる上に、フォーマットを決めず「表示そのまま」にすることができるのです。その場合は、 @
を指定します。
range.setNumberFormat('@');
今回は取り込んだデータを、そのまま別のテキストに差し込むために使いたかったので、データ範囲全体に上記を適用して解決しました。
以上、魔法の1行の紹介でした。