Skip to content

Instantly share code, notes, and snippets.

@goofmint
Created April 5, 2018 12:27
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/c97896c7b2c2d89a479f58e7085d4aa6 to your computer and use it in GitHub Desktop.
Save goofmint/c97896c7b2c2d89a479f58e7085d4aa6 to your computer and use it in GitHub Desktop.
function syncData() {
var userProperties = PropertiesService.getScriptProperties();
var application_key = userProperties.getProperty("APPLICATION_KEY");
var client_key = userProperties.getProperty("CLIENT_KEY");
var ncmb = NCMB.init(application_key, client_key);
var userName = userProperties.getProperty("USER_NAME");
var password = userProperties.getProperty("PASSWORD");
ncmb.User.login(userName, password);
var objSheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
for (var i = 0; i < objSheets.length; i += 1) {
syncClass(ncmb, objSheets[i]);
}
}
function syncClass(ncmb, sheet) {
// クラス名の取得と、データストアの準備
var className = sheet.getName();
var Item = ncmb.DataStore(className);
// 必要な変数の初期化
var fields = [];
var coulmn = 1;
var objectIds = [];
// 一行目を使ってカラム名を取得
while (true) {
var field = sheet.getRange(1, coulmn).getValue();
if (field == '') break;
coulmn += 1;
fields.push(field);
}
// データの登録および更新処理
var rowIndex = 2;
while (true) {
// クラスのインスタンスを容易
var item = new Item;
// すべての行が空であれば、処理終了とします
var range = sheet.getRange(rowIndex, 1, 1, fields.length);
if (range.isBlank()) break;
// 各行を処理します
for (var i = 0; i < fields.length; i += 1) {
// 表示されている値と、そこで使われている計算式を取ります
var value = sheet.getRange(rowIndex, i + 1).getValue();
var formula = sheet.getRange(rowIndex, i + 1).getFormula();
// 値がない場合には処理対象外です
if (value != '') {
// 計算式がある場合
if (formula != '') {
// A列(objectId)が処理対象か否か
var pClassName = formula.replace(/=(.*?)!A[0-9]+.*$/, "$1");
// objectIdが計算式にある場合はポインターとします
if (pClassName) {
value = {
"__type":"Pointer",
"className": pClassName,
"objectId": value
};
}
}
// 値をセットします
item.set(fields[i], value);
}
}
// ACLは決め打ちです。ワークフローに合わせて変更してください
item.set('acl', {
"*": {
"read": true, // 全員に読み込み権限
},
"role:Admin":{ // Adminというロールに書き込み権限
"read": true, "write": true
}
});
// オブジェクトIDの有無によって登録/更新を変えています
var error = item.get('objectId') ? item.update() : item.save();
// エラー判定
if (!error) {
// エラーがなければ行のA列の値をobjectIdにします
sheet.getRange(rowIndex, 1).setValue(item.get('objectId'));
// ここで処理されたobjectIdは削除対象外のデータとします
objectIds.push(item.get('objectId'));
}
rowIndex += 1;
}
// 現在クラスにある全データ(最大1000件)を取得します
var items = Item.limit(1000).fetchAll();
for (var i = 0; i < items.length; i += 1) {
// 処理対象だったかどうかチェックします
if (objectIds.indexOf(items[i].get('objectId')) > -1 ) {
} else {
// 処理対象でなかったのでデータを消します
items[i].destroy();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment