使用特定 Apps 脚本时,我无法撤消超过一步的操作

问题描述 投票:0回答:1

开始...我在发布下面的问题后添加了这个

例如,在 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())
      }
    }
  }
}

我在 2022 年 1 月 29 日尝试了以下操作,但导致原始凭证停止正常工作

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]);
}
}
google-sheets google-apps-script undo
1个回答
1
投票

问题:

更改刚刚编辑的值的

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]);
}
}
© www.soinside.com 2019 - 2024. All rights reserved.