1

非常に恥ずかしいことですが、この例のスクリプトを変更して、スプレッドシートからデータベースを作成することをテストしました。

function loadDatabaseFromSheet() {
  var sheet = SpreadsheetApp.openById('my_key').getSheetByName('Payroll');
  var data = sheet.getDataRange().getValues();
  data = data.splice(0, 9);                 // **this is where I went wrong**
  var keys = data[0];                       // **this actually corresponds with a blank row**
  var db = ScriptDb.getMyDb();
  for (var row = 1; row < data.length; row++) {
    var rowData = data[row];
    var item = {};
    for (var column = 0; column < keys.length; column++) {
      item[keys[column]] = rowData[column]; // **null values used to name attributes???**
    }
    db.save(item);
  }
}

したがって、Javascritnoobは。data.splice(0, 9)ではなく使用する必要がありdata = data.splice(0, 9)ます。配列から最初の9行を削除し、保持したくありませんでした。

とにかく、データベースは修復も消去もできないのは現状のようです。レコードを取得できません。.next()または.hasNext()を呼び出そうとすると、サーバーエラーがスローされます。たとえば、次のスクリプトを使用します

function deleteAll() {
  var db = ScriptDb.getMyDb();
  while (true) {
    var result = db.query({}); // get everything, up to limit
    if (result.getSize() == 0) {
      break;
    }
    while (result.hasNext()) {
      db.remove(result.next());
    }
  }
}

.getSize()は機能しますが、スクリプトが.hasNext()の行に到達すると、おそらくオブジェクトに障害があるために、サーバーエラーを返します。バッチ削除も試しました:

function batchRemove() {
  var db = ScriptDb.getMyDb();
  var result = db.query({});
  db.removeBatch(result, false); 
}

そして私は得る:

メソッドremoveBatch($ Proxy799、boolean)が見つかりません。(114行目)

ちなみに、新しいレコードをデータベースに正常に保存し、クエリでそのレコードを取得することはできますが、クエリが欠陥のあるスクリプトで作成されたデータベース内の他の何かを返す場合、それは私が試してみると失敗するときです結果のオブジェクトを操作します。

だから私は自分のエラーを理解し、将来もっと注意を払うことを約束しますが、データベースを「クリーンアップ」して再開する方法を誰かが知っていますか?

4

2 に答える 2

0

誤報ではなかったと思います.ScriptDb上で動作する関数が実行時間を超えたときに同様の動作を経験しました. 実行時エラーの影響を受けるオブジェクトを削除したり、何らかの方法で操作したりすると、ScriptDb が応答しなくなります。あなたができることは待つことだけのようで、その後すべてが正常に戻ります。ベスト プラクティスは、ScriptDb とやり取りする関数が実行時間の制限に達するのを防ぐための戦略を確立することです。

于 2013-03-19T15:12:43.107 に答える
0

OK 誤報だと思います。もう一度試してみたところ、データベースをクリアできるようになりました。

于 2012-07-03T09:22:41.813 に答える