Guest User

Untitled

a guest
Apr 13th, 2018
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.41 KB | None | 0 0
  1. function syncData() {
  2. var userProperties = PropertiesService.getScriptProperties();
  3. var application_key = userProperties.getProperty("APPLICATION_KEY");
  4. var client_key = userProperties.getProperty("CLIENT_KEY");
  5. var ncmb = NCMB.init(application_key, client_key);
  6. var userName = userProperties.getProperty("USER_NAME");
  7. var password = userProperties.getProperty("PASSWORD");
  8.  
  9. ncmb.User.login(userName, password);
  10. var objSheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  11. for (var i = 0; i < objSheets.length; i += 1) {
  12. syncClass(ncmb, objSheets[i]);
  13. }
  14. }
  15.  
  16. function syncClass(ncmb, sheet) {
  17. // クラス名の取得と、データストアの準備
  18. var className = sheet.getName();
  19. var Item = ncmb.DataStore(className);
  20. // 必要な変数の初期化
  21. var fields = [];
  22. var coulmn = 1;
  23. var objectIds = [];
  24. // 一行目を使ってカラム名を取得
  25. while (true) {
  26. var field = sheet.getRange(1, coulmn).getValue();
  27. if (field == '') break;
  28. coulmn += 1;
  29. fields.push(field);
  30. }
  31. // データの登録および更新処理
  32. var rowIndex = 2;
  33. while (true) {
  34. // クラスのインスタンスを容易
  35. var item = new Item;
  36. // すべての行が空であれば、処理終了とします
  37. var range = sheet.getRange(rowIndex, 1, 1, fields.length);
  38. if (range.isBlank()) break;
  39. // 各行を処理します
  40. for (var i = 0; i < fields.length; i += 1) {
  41. // 表示されている値と、そこで使われている計算式を取ります
  42. var value = sheet.getRange(rowIndex, i + 1).getValue();
  43. var formula = sheet.getRange(rowIndex, i + 1).getFormula();
  44. // 値がない場合には処理対象外です
  45. if (value != '') {
  46. // 計算式がある場合
  47. if (formula != '') {
  48. // A列(objectId)が処理対象か否か
  49. var pClassName = formula.replace(/=(.*?)!A[0-9]+.*$/, "$1");
  50. // objectIdが計算式にある場合はポインターとします
  51. if (pClassName) {
  52. value = {
  53. "__type":"Pointer",
  54. "className": pClassName,
  55. "objectId": value
  56. };
  57. }
  58. }
  59. // 値をセットします
  60. item.set(fields[i], value);
  61. }
  62. }
  63. // ACLは決め打ちです。ワークフローに合わせて変更してください
  64. item.set('acl', {
  65. "*": {
  66. "read": true, // 全員に読み込み権限
  67. },
  68. "role:Admin":{ // Adminというロールに書き込み権限
  69. "read": true, "write": true
  70. }
  71. });
  72.  
  73. // オブジェクトIDの有無によって登録/更新を変えています
  74. var error = item.get('objectId') ? item.update() : item.save();
  75. // エラー判定
  76. if (!error) {
  77. // エラーがなければ行のA列の値をobjectIdにします
  78. sheet.getRange(rowIndex, 1).setValue(item.get('objectId'));
  79. // ここで処理されたobjectIdは削除対象外のデータとします
  80. objectIds.push(item.get('objectId'));
  81. }
  82. rowIndex += 1;
  83. }
  84. // 現在クラスにある全データ(最大1000件)を取得します
  85. var items = Item.limit(1000).fetchAll();
  86. for (var i = 0; i < items.length; i += 1) {
  87. // 処理対象だったかどうかチェックします
  88. if (objectIds.indexOf(items[i].get('objectId')) > -1 ) {
  89. } else {
  90. // 処理対象でなかったのでデータを消します
  91. items[i].destroy();
  92. }
  93. }
  94. }
Add Comment
Please, Sign In to add comment