4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Apps ScriptAdvent Calendar 2017

Day 3

Google App Maker ー Drive Tables のバックアップ方法

Last updated at Posted at 2017-12-02

一番基本の DB である Drive Tables のデータバックアップ方法について記載。

そもそも App Maker ってなに?という人は、以下の記事を参照してください。
Google App Maker とは? 短期間で Web アプリケーション構築を可能にした理由

TL;DR

日付フィールドがないなら標準のエクスポートを使え。
日付フィールドがあるなら頑張ってスクリプトを書く。
日付フィールドがあってRelationも使ってる場合は超頑張ってスクリプトを書く。

金があるならCloud SQLを使う。

検証データの作成

次のようなモデルを作成
image.png

また、サーバースクリプトを用意して検証用データを作成する。
※スクリプトを利用したデータの投入方法は次の記事で解説している
Google App Maker ー Drive Tables へのデータ投入方法 - Qiita

サーバースクリプト
function _createData() {
  var records = [];

  for (var i = 0; i < 24; i++) {
    var retiredAt = new Date('2017/10/1');
    retiredAt.setHours(i);
    
    var record = app.models.User.newRecord();
    record.Name = 'data' + i;
    record.Retired = true;
    record.Age = 40;
    record.RetiredAt = retiredAt;
    
    records.push(record);
  }
  app.saveRecords(records);  
}

テーブルウィジェットを使って表示すると次のようになる

image.png

ポイントは退職日の時間表示の部分。
バインディング時に formatDate を使って時間まで表示している。
image.png

バックアップ方法その1 ー エクスポート機能を使う

Deployments の画面から行う

image.png

image.png

スプレッドシートを開くと次のようになる。
image.png

重要なポイントは2点ある。

  1. 日付フィールド はUTCが基準になる
  2. 日付フィールド は時間部が削られる

これは単純にデータがぶっ壊れるということを意味している。
例えば Date Box ウィジェットを使って日付を登録するとブラウザのタイムゾーンの0時が設定される。
つまり、日本で 10月1日 10月2日 を登録するとこうなる。
image.png

これをエクスポートするとUTCにされてから時間が削られるため、かならず1日前の値になる。
image.png

なので日付フィールドがある場合は、
次の2点が確約されていないとエクスポートをデータのバックアップとしては使えない。

  1. 日本でしか使ってない(ブラウザのタイムゾーンがJST固定)
  2. 日付フィールドは Date Box ウィジェットでしか使っていない(時分秒は使っていない)

バックアップ方法その2 ー スクリプトを用いてエクスポートする

次のようなスクリプトを書いてスプレッドシートにエクスポートする

function _exportAllData() {
  var records = app.models.User.newQuery().run();
  var saveValues = [];
  saveValues.push(['_key', 'Name', 'Age', 'Retired', 'RetiredAt']);
  
   for (var i=0; i < records.length; i++) {
    var record = records[i];
    var values = [1,2,3,4,5];
    values[0] = record._key;
    values[1] = record.Name;
    values[2] = record.Age;
    values[3] = record.Retired;
    values[4] = record.RetiredAt;
    console.log(values);
    saveValues.push(values);
  }
  
  var ss = SpreadsheetApp.openById('1kR0XNntqwwusSBQUCVdl-Agc3cEWtP3PmBmbCn9Qgzw');
  var sheet = ss.getSheetByName('Sheet1');
  var range = sheet.getRange(1, 1, saveValues.length, saveValues[0].length);
  range.setValues(saveValues);
}

結果はこんなかんじ。
image.png

次にインポート処理のスクリプトを書いてインポートしたい環境で実行する。

function _importAllData() {
  var ss = SpreadsheetApp.openById('1kR0XNntqwwusSBQUCVdl-Agc3cEWtP3PmBmbCn9Qgzw');
  var sheet = ss.getSheetByName('Sheet1');
  var dataRangeValues = sheet.getDataRange().getValues();
  
  var records = [];
  for (var i=1; i < dataRangeValues.length; i++) {
    var values = dataRangeValues[i];
    console.log(values);
    var record = app.models.User.newRecord();
//     record._key = values[0];
    record.Name = values[1];
    record.Age = values[2];
    record.Retired = values[3];
    record.RetiredAt = values[4];
    
    records.push(record);
  }
  app.saveRecords(records);  
}

_keyは読み取り専用フィールドなので捨てて新しく採番されたやつを使う。

Relationを使ったモデルだったらこのインポートスクリプトが複雑になると思うけど、できなくはないと思う。

バックアップ方法 番外 ー Drive Tables を捨てて Cloud SQLを使う

金があるなら、これが一番楽。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?