Apps 脚本在一次将数据输入一个单元格时正常工作,但在一次将数据粘贴到多个单元格时失败

Apps Script works properly when data is entered into one cell at a time yet fails when data is pasted into multiple cells at once


** 我在这个问题前添加的附加信息 **

假设我想在我的 Google Sheet.

中输入一个名为 Alice 的用户

在我将 Alice 输入 A2 后,Alice 也会出现在 B2 中(按照 Apps 脚本中的指示添加了超链接)。

行得通。不错。

但是...现在,假设我有一个文本文档,第 1 行是 Alice,第 2 行是 Bob,第 3 行是 Carl。当然,我可以将 Alice 复制到 A2,然后将 Bob 复制到A3,最后将Carl复制到A4中。那会起作用,但是,那显然很乏味。

当然,我想一次复制所有三行(包含所有 3 个名称)。此外,然后我想立即将 Alice 粘贴到 A2,Bob 粘贴到 A3,Carl 粘贴到 A4 (按照 Apps 脚本中的指示添加超链接)。


** 我原来的问题 **

这个GoogleSheet-->Behance.net- sample spreadsheet表示我要完成的事情。

以下信息出现在我在绘图中创建的评论中,在上面链接的 sheet 打开后不久。

当我输入 aaa 时,它起作用了。 当我输入 bbb 时,它起作用了。 当我粘贴 ccc、ddd 和 eee 时,它失败了。

“有效”是什么意思?例如,这意味着我在 A3 中输入 aaa 后立即创建了一个超链接,并且 A3 的副本出现在 B3 中。

“失败”是什么意思?例如,这意味着我将 ccc、ddd 和 eee 一次全部粘贴到 A6、A7 和 A8 之后(即不是一次一个)没有任何反应。即未创建超链接,A6、A7、A8的副本未能出现在B6、B7、B8中。

上面的“魔法”发生在以下 Apps 脚本中....

function onEdit(e) {
const sheet = e.source.getActiveSheet();
const range = e.range;
const value = e.value;

console.log(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){
  Browser.msgBox(JSON.stringify(e))
}

修改单个单元格时:

{"authMode":"LIMITED","value":"c","oldValue":"A","user":{"email":"xxxxxxxxxx@gmail.com","nickname":xxxxxxxxxx"},"range":{"columnEnd":3,"columnStart":3,"rowEnd":1,"rowStart":1},"source":{}}

修改两个或多个单元格时:

{"user":{"email":"xxxxxxxxxx@gmail.com","nickname":"xxxxxxxxxx"},"range":{"columnEnd":3,"columnStart":3,"rowEnd":4,"rowStart":1},"authMode":"LIMITED","source":{}}

因此,您可以随时通过以下方式确定范围:

var range = [e.range.columnEnd,e.range.columnStart,e.range.rowEnd,e.range.rowStart]

因此您可以按照自己的意愿进行操作,例如:

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++){
      // do something ... as
      sh.getRange(i,j).setBackground('red')
    }
  }
}

'new values' 也可用 sh.getRange(i,j).getValue()(不是旧的)

编辑:应用到您的脚本

我认为您可以通过这种方式保留脚本的核心(如果它按预期工作)

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]);
}
}