Google apps script 尝试在ScriptDb中存储数组时出错

Google apps script 尝试在ScriptDb中存储数组时出错,google-apps-script,Google Apps Script,我有一个由脚本创建的对象数组,我正在尝试将该数组复制到一个新数组中,然后使用以下函数将其存储在scriptDb中: function copyAndStore (currentArray) { var db = ScriptDb.getMyDb(); var copyArray = []; for (var i in currentArray) { copyArray.push(currentArray[i]); } var id = db.save(copyArra

我有一个由脚本创建的对象数组,我正在尝试将该数组复制到一个新数组中,然后使用以下函数将其存储在scriptDb中:

function copyAndStore (currentArray) {
  var db = ScriptDb.getMyDb();
  var copyArray = [];
  for (var i in currentArray) {
    copyArray.push(currentArray[i]);
  }
  var id = db.save(copyArray);
  return id;
}
它正确地复制了所有内容,但当它到达var id=db.savecopyArray时;我得到一个错误:参数无效。应为javascript映射对象

ScriptDb是否存在存储阵列的问题?提前感谢您的帮助。

ScriptDb只存储地图对象。但是,您可以存储包含数组的映射

您可以使用数组在一次调用中使用db.saveBatch保存多个对象。

ScriptDb仅存储映射对象。但是,您可以存储包含数组的映射


您可以使用数组在一次调用中使用db.saveBatch保存多个对象。

正如@Thomas所说,您可以在map对象中保存数组

在将对象放入ScriptDB之前,也不需要执行复制操作。您可以通过简单的db.save{myArray}保存数组,并记住ID

这里有一些极简主义的代码来演示。我展示了两种检索保存的数组的方法——一种是按ID检索,这似乎是您计划的方式,另一种是使用键值进行查询。如果希望在以后的代码运行中检索ScriptDB的内容,这种方法就不需要以某种方式记住存储数组的ID

function saveArray (currentArray) {
  var db = ScriptDb.getMyDb();
  return db.save({type: "savedArray", data:currentArray}).getId();
}

function loadArrayById (id) {
  var db = ScriptDb.getMyDb();
  return db.load(id).data;
}

function loadArrayByType () {
  var db = ScriptDb.getMyDb();
  var result = db.query({type: "savedArray"});
  if (result.hasNext()) {
    return result.next().data;
  }
  else {
    return [];
  }
}

function test() {
  var arr = ['this','is','a','test'];
  var savedId = saveArray( arr );
  var loaded1 = loadArrayById( savedId );
  var loaded2 = loadArrayByType();
  debugger;  // pause if running debugger
}
以下是调试器暂停时您将看到的内容:


请注意,通过使用地图标记数据从保存的对象中提取数组,loaded1和loaded2都与源数组arr相同。

正如@Thomas所说,您可以在地图对象中保存数组

在将对象放入ScriptDB之前,也不需要执行复制操作。您可以通过简单的db.save{myArray}保存数组,并记住ID

这里有一些极简主义的代码来演示。我展示了两种检索保存的数组的方法——一种是按ID检索,这似乎是您计划的方式,另一种是使用键值进行查询。如果希望在以后的代码运行中检索ScriptDB的内容,这种方法就不需要以某种方式记住存储数组的ID

function saveArray (currentArray) {
  var db = ScriptDb.getMyDb();
  return db.save({type: "savedArray", data:currentArray}).getId();
}

function loadArrayById (id) {
  var db = ScriptDb.getMyDb();
  return db.load(id).data;
}

function loadArrayByType () {
  var db = ScriptDb.getMyDb();
  var result = db.query({type: "savedArray"});
  if (result.hasNext()) {
    return result.next().data;
  }
  else {
    return [];
  }
}

function test() {
  var arr = ['this','is','a','test'];
  var savedId = saveArray( arr );
  var loaded1 = loadArrayById( savedId );
  var loaded2 = loadArrayByType();
  debugger;  // pause if running debugger
}
以下是调试器暂停时您将看到的内容:


请注意,通过使用地图标记数据从保存的对象中提取数组,loaded1和loaded2都与源数组arr相同。

currentArray中有什么?currentArray是一个对象数组,包含有关不同部门名称、成员、每月访问、以及,等等。只需确保不要尝试存储本机日期对象。这可能会导致沉默和含糊不清的错误。@Jonathon说得很好。如果最终需要存储日期对象,请仔细阅读以避免出现问题。currentArray中有什么?currentArray是一个对象数组,包含有关不同部门名称、成员、每月访问等的信息和统计信息。请确保不要尝试存储本机日期对象。这可能会导致沉默和含糊不清的错误。@Jonathon说得很好。如果最终需要存储日期对象,请仔细阅读以避免出现问题。抱歉,我是新手,那么如何创建包含要存储的数组的映射?我在脚本前面使用db.saveBatch来存储电子表格中有关部门的原始数据;您可以在其中提供一些标识符,以便以后检索它。然后您可以只使用db.savemyObj;抱歉,我是新手,因此如何创建包含要存储的数组的映射?我在脚本前面使用db.saveBatch来存储电子表格中有关部门的原始数据;您可以在其中提供一些标识符,以便以后检索它。然后您可以只使用db.savemyObj+1用于调试器。我倾向于将void0分散在各处,并在其中添加/删除中断。调试器为+1。我倾向于将空隙0分散在各处,并在其中添加/删除打断。