Skip to content

Instantly share code, notes, and snippets.

@goofmint
Created May 20, 2017 01:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save goofmint/7a2f5ab07281506c9a0834fe0b680d34 to your computer and use it in GitHub Desktop.
Save goofmint/7a2f5ab07281506c9a0834fe0b680d34 to your computer and use it in GitHub Desktop.
mBaaSのデータをGoogleスプレッドシートへバックアップ
function DataStoreBackup() {
// NCMBの準備
var application_key = 'APPLICATION_KEY';
var client_key = 'CLIENT_KEY';
var ncmb = NCMB.init(application_key, client_key);
var dataTest = ncmb.DataStore("dataTest");
// スプレッドシートのオブジェクト
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
// バックアップ済みデータの最終行に関する情報を取得
var range = sheet.getRange("B2");
var lastDate = range.getValue();
if (lastDate != '') {
// 最終更新日があれば
lastDate = new Date(lastDate);
dataTest = dataTest.greaterThanOrEqualTo("updateDate", lastDate);
}
// 設定。limitで一回当たりに取得するデータ数を指定(MAXは1000)
var limit = 10;
var page = 0;
dataTest = dataTest.limit(limit);
// バックアップを記載する最終行を取得
var row_index = 4;
var last_row = getLastRow(sheet);
while (true) {
// データストア検索
var results = dataTest
.order('updateDate')
.fetchAll();
// 新しいデータがなければ終了
if (results.length == 0) {
break;
}
// カラムを生成
makeColumns(sheet, results[0].fields);
var keys = Object.keys(results[0].fields);
// バックアップ開始
for (var i = 0; i < results.length; i++) {
var row = results[i];
var values = [];
for (var j = 0; j < keys.length; j++) {
values.push(row.fields[keys[j]]);
}
// すでに記録済みであれば更新
if (index = existObjectId(sheet, row.get("objectId"))) {
array2row(sheet, index, values);
}else{
array2row(sheet, last_row, values);
last_row++;
}
}
// 最終行の日付を記録
var updateDate = new Date(results[results.length - 1].get("updateDate"));
if (lastDate < updateDate) {
sheet.getRange("B2").setValue(updateDate);
lastDate = updateDate;
}
// MAXの取得行数に満たなかったら終了
if (results.length < limit) {
break;
}
// 次の取得へ
page++;
dataTest = dataTest.skip(page * limit);
}
}
// すでにobjectIdが記録済みかチェックします
function existObjectId(sheet, value) {
var row_index = 4;
while (true) {
var objectId = sheet.getRange(row_index, 1).getValue();
if (objectId == "") {
return false;
}
if (objectId == value) {
return row_index;
}
row_index++;
}
}
// 記録されている最終行を取得します
function getLastRow(sheet) {
var last_row = 4;
while (true) {
if (sheet.getRange(last_row, 1).getValue() == "") {
return last_row;
}
last_row++;
}
}
// カラムを作ります
function makeColumns(sheet, fields) {
var keys = Object.keys(fields);
if (sheet.getRange("A2").getValue() == "objectId")
return;
array2row(sheet, 3, keys);
}
// 配列を指定された行に順番に出力します
function array2row(sheet, row, ary) {
for (var i = 0; i < ary.length; i++) {
sheet.getRange(row, i+1).setValue(ary[i]);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment