我的onEdit()函数不断删除我的数据

时间:2018-08-06 15:46:30

标签: google-apps-script google-sheets triggers

我有一个带有两个标签的Google表格(1)管理员和(2)用户。我有这个脚本:

function onEdit() {
       var source = SpreadsheetApp.openById('xxx');
       var sourcesheet = source.getSheetByName('Admin');

       var target = SpreadsheetApp.openById('yyy')
       var targetsheet = target.getSheetByName('User');

       var targetrange = targetsheet.getRange(2, 1, sourcesheet.getLastRow(), sourcesheet.getLastColumn());
       var rangeValues = sourcesheet.getRange(2, 1, sourcesheet.getLastRow(), sourcesheet.getLastColumn()).getValues();

       targetrange.setValues(rangeValues);
}

因此,基本上,管理员中的所有更新也会反映在用户表中。

问题是,当我更新用户中的某些内容时,除非与管理员中的内容相同,否则我的脚本会自动将其删除。

我希望它是一种单向连接,当“用户”表更新时,“管理”表中什么也没有发生。但是,当管理员中的某些内容更新时,用户也会被更新。

非常感谢!

2 个答案:

答案 0 :(得分:3)

编辑“用户”表的原因是“自动删除,除非与 Admin 中的设置相同”,这是因为您的onEdit函数在 any < / strong>用户的单元格编辑-命名为onEdit的意思是:您希望该函数使用带有“编辑”条件的simple trigger

因此,当您在“用户”工作表(或同一工作簿中的第3个或第4个工作表)上编辑单元格时,脚本将运行,并用“管理”表的当前状态覆盖“用户”表。为了防止这种情况的发生,您需要以if语句的形式添加“代码保护”,除非满足您选择的某些条件,否则它将阻止对代码段的访问:

if (myVar === "silly string") {
  // only run this code when `myVar` is exactly `"silly string"`
} else if (myVar === "bubble gum") {
  // only run this code when `myVar` is exactly `"bubble gum"`
} else {
  // run this code when `myVar` is anything except `"silly string"` or `"bubble gum"`
}

您可以通过调用return来停止执行该函数:

function onEdit(e) {
  if (!e)
    return; // Stop executing this function

  // We are guaranteed that `e` is not `false`, `null`, `undefined`, `""`, or `0` at this point.
}

因此,要获得声明的单向编辑链接,您需要保护写入用户表的代码。您可以从传递的event object中获取有关编辑的信息:

function onEdit(eventObject) {
  if (!eventObject) return;
  const edited = eventObject.range;
  const sheet = edited.getSheet();
  if (sheet.getName() === "Admin") {
    HandleEditsToAdmin_(eventObject);
    // other code to be run for edits to the sheet named "Admin"
  }
  // other code to be run for generic edits (or other guards for other specific edit handling, etc.)
}
function HandleEditsToAdmin_(e) {
  // your code here
}

请注意,您当前的代码将“ Admin”表的值直接逐字复制到“ User”表,因此,即使您添加了代码防护,只要编辑了“ Admin”,以前对“除非您还根据@Ed Nelson的答案更新代码,否则“用户”工作表将被删除。

答案 1 :(得分:0)

除了@tehhowch的巨大贡献之外,这是另一个解决方案:

WebMvcConfigurerAdapter

此脚本会将所有更新从Admin复制到用户,但不会复制到其他用户,如果再次在Admin中更新了单元格(如果该单元格为空或空白),这还将保留用户表中的所有更改