我有一个带有两个标签的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);
}
因此,基本上,管理员中的所有更新也会反映在用户表中。
问题是,当我更新用户中的某些内容时,除非与管理员中的内容相同,否则我的脚本会自动将其删除。
我希望它是一种单向连接,当“用户”表更新时,“管理”表中什么也没有发生。但是,当管理员中的某些内容更新时,用户也会被更新。
非常感谢!
答案 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中更新了单元格(如果该单元格为空或空白),这还将保留用户表中的所有更改