例如,在 A2 或 B2 中输入“ulianababenko”将导致 A2 和 B2 都显示“ulianababenko”。是的。 A2 和 B2 将显示相同的文本。
但是,A2 将链接到 behance.net/ulianababenko,而 B2 将链接到 behance.net/ulianababenko/moodboards。换句话说,A2 将链接到第一个 URL; B2 将链接到第二个 URL。
通常在普通的 Google Sheet 中,当我反复按
Ctrl + z
时,我可以撤消许多后退步骤。
但是,在这个 Google Sheet --> Behance.net- 示例电子表格 中,例如,当我将 A3 从 test1 更改为 Ben,然后将 A4 从 test2 更改为 Jacob,然后按
Ctrl + z
一旦我我能够撤销雅各布(A4中)。然而,当我第二次按 Ctrl + z
时,我无法撤消 Ben(在 A3 中)。
在这种情况下,当然,我希望能够撤消 Ben(在 A3 中)。
上面链接的 Google 表包含以下 Apps 脚本....
function onEdit(e){
var sh = e.source.getActiveSheet()
for (var i = e.range.rowStart;i<=e.range.rowEnd;i++){
for (var j = e.range.columnStart;j<=e.range.columnEnd;j++){
myFunction(sh,sh.getRange(i,j),sh.getRange(i,j).getValue())
}
}
}
function myFunction(sheet,range,value){
if (sheet.getName() == "RemcoE33" && range.getColumn() < 3 && range.getRow() > 1) {
const urls = [`https://www.behance.net/${value}`,`https://www.behance.net/${value}/moodboards`];
const richTextValues = [];
console.log(urls);
urls.forEach(url => {
richTextValues.push(SpreadsheetApp.newRichTextValue()
.setText(value)
.setLinkUrl(url)
.build())
});
sheet.getRange(range.getRow(), 1, 1, 2).setRichTextValues([richTextValues]);
}
}
function onEdit(e){
var sh = e.source.getActiveSheet()
for (var i = e.range.rowStart;i<=e.range.rowEnd;i++){
for (var j = e.range.columnStart;j<=e.range.columnEnd;j++){
myFunction(sh,sh.getRange(i,j),sh.getRange(i,j).getValue())
}
}
}
function myFunction(sheet,range,value){
if (sheet.getName() == "RemcoE33" && range.getColumn() < 3 && range.getRow() > 1) {
const urls = [`https://www.behance.net/${value}`,`https://www.behance.net/${value}/moodboards`];
const richTextValues = [];
console.log(urls);
urls.forEach(url => {
richTextValues.push(SpreadsheetApp.newRichTextValue()
.setText(value)
.setLinkUrl(url)
.build())
});
sheet.getRange(range.getRow(), 1, 1, 2).setRichTextValues([richTextValues]);
}
}
function onEdit(e){
if (!e.oldValue.includes("https://www.behance.net")) {
var sh = e.source.getActiveSheet()
for (var i = e.range.rowStart;i<=e.range.rowEnd;i++){
for (var j = e.range.columnStart;j<=e.range.columnEnd;j++){
myFunction(sh,sh.getRange(i,j),sh.getRange(i,j).getValue())
}
}
}
}
function onEdit(e){
if (!e.oldValue.includes("https://www.behance.net")) {
var sh = e.source.getActiveSheet()
for (var i = e.range.rowStart;i<=e.range.rowEnd;i++){
for (var j = e.range.columnStart;j<=e.range.columnEnd;j++){
myFunction(sh,sh.getRange(i,j),sh.getRange(i,j).getValue())
}
}
}
}
function myFunction(sheet,range,value){
if (sheet.getName() == "RemcoE33" && range.getColumn() < 3 && range.getRow() > 1) {
const urls = [`https://www.behance.net/${value}`,`https://www.behance.net/${value}/moodboards`];
const richTextValues = [];
console.log(urls);
urls.forEach(url => {
richTextValues.push(SpreadsheetApp.newRichTextValue()
.setText(value)
.setLinkUrl(url)
.build())
});
sheet.getRange(range.getRow(), 1, 1, 2).setRichTextValues([richTextValues]);
}
}
更改刚刚编辑的值的
onEdit
函数不适用于撤消更改。
对于用户所做的每一次编辑,您的脚本都会进行额外的编辑:将新值转换为富文本值。
因此,为了撤消每个手动编辑,您应该撤消该操作两次(一次用于手动编辑,一次用于脚本编辑)。但是,每次您通过
ctrl + z
撤消操作时,该“撤消”都会被视为进一步编辑,并且您的脚本会再次触发,从而对电子表格进行额外更改。
也就是说,每次您尝试撤消更改时,脚本都会进行额外的更改。因此,如果您想撤消多个操作,则必须多次按
ctrl + z
且速度足够快,以免脚本有时间再次更改值。
作为针对您的具体情况的解决方法,我建议检查旧值(预编辑)是否包含字符串
https://www.behance.net
(使用事件对象属性e.oldValue
)。如果我正确理解您的工作流程,这意味着脚本是由于“撤消”操作而触发的,因此不应进行额外的编辑。
function onEdit(e){
try {
if (!e.oldValue.includes("https://www.behance.net")) {
update(e);
}
} catch(err) {
update(e);
}
}
function update(e) {
var sh = e.source.getActiveSheet()
for (var i = e.range.rowStart;i<=e.range.rowEnd;i++){
for (var j = e.range.columnStart;j<=e.range.columnEnd;j++){
myFunction(sh,sh.getRange(i,j),sh.getRange(i,j).getValue())
}
}
}
function myFunction(sheet,range,value){
if (sheet.getName() == "RemcoE33" && range.getColumn() < 3 && range.getRow() > 1) {
const urls = [`https://www.behance.net/${value}`,`https://www.behance.net/${value}/moodboards`];
const richTextValues = [];
console.log(urls);
urls.forEach(url => {
richTextValues.push(SpreadsheetApp.newRichTextValue()
.setText(value)
.setLinkUrl(url)
.build())
});
sheet.getRange(range.getRow(), 1, 1, 2).setRichTextValues([richTextValues]);
}
}