Created
April 5, 2018 12:27
-
-
Save goofmint/c97896c7b2c2d89a479f58e7085d4aa6 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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