【问题标题】:Auto Move Google Form Response by ticking check box通过勾选复选框自动移动 Google 表单响应
【发布时间】:2020-10-02 11:07:28
【问题描述】:

我有谷歌表格。用户填写谷歌表单并创建一个名为“表单响应”的工作表来记录用户响应。如果我在 W 列中打勾,我想使用脚本来移动数据,从“表单响应”表到“已验证的表单响应”。

表单响应表的链接是

https://docs.google.com/spreadsheets/d/1LUUEZ7sSjBy-WWL3TZt8l6sqtrEBn3dZ03iRDTY1bF0/edit?usp=sharing

我使用的脚本是:

function onEdit(event) {
  // assumes source data in sheet named Needed
  // target sheet of move to named Acquired
  // test column with yes/no is col 23 or W
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();
  if(s.getName() == "Form responses 1" && r.getColumn() == 23 && r.getValue() == true) {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Verified Form Responses");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).copyTo(target);
    s.deleteRow(row);
  }
}

此代码不起作用。请帮忙。

【问题讨论】:

  • 它不起作用是什么意思?您在执行页面中看到任何错误吗?你看到了你没想到的行为吗?因为我从您分享的文件中看到的是代码运行良好。

标签: google-apps-script google-sheets


【解决方案1】:

问题:

由于某种原因,脚本正在检测来自Verified Form Responses 工作表的所有 1000 行中的内容。

这可以通过记录targetSheet.getDataRange().getA1Notation()来检查:记录的符号是A1:Z1000,这意味着脚本在第1000行看到了一些内容。也可以使用appendRow(rowContents)来检查:提供的数据附加到第 1001 行,而不是应该没有内容的第一行。从这些行中删除所有值之类的操作不会导致任何更改(脚本仍然认为这些行有内容)。

我不确定这是什么原因,因为我没有看到任何可能会导致问题的数组公式。但是添加到工作表的每个新行都被解释为有内容。

无论如何,由于它正在检测第 1000 行(工作表中的最后一个)中的内容,getLastRow() + 1(即第 1001 行)在工作表的尺寸之外,所以会出现以下错误消息:

目标范围的坐标在工作表的尺寸之外。

解决方案:

幸运的是,您有很多方法可以解决这个问题。选择您喜欢的:

  • 创建一个新的目标表,并将您的数据发送到那里,而不是发送到Verified Form Responses
  • Verified Form Responses(即A42:Z1000)中删除所有假定为空的行,并使用appendRow而不是copyTo(不会复制格式):
var targetSheet = ss.getSheetByName("Verified Form Responses");
targetSheet.appendRow(s.getRange(row, 1, 1, numColumns).getValues()[0]);
  • 通过应用getDataRange() 并过滤掉所有单元格为空的行(仅在中间没有空行时有效),找到没有内容的实际第一行:
var targetSheet = ss.getSheetByName("Verified Form Responses");
var realLastRow = targetSheet.getDataRange().getValues()
                             .filter(row => row.join('') != "").length;
var target = targetSheet.getRange(realLastRow + 1, 1);
s.getRange(row, 1, 1, numColumns).copyTo(target);

【讨论】:

  • 谢谢。此脚本正在与我一起使用,但此工作表已与其他具有编辑权限的团队成员共享。当其他团队成员单击复选框时,条目不会移动到“已验证的表单响应”表。
  • @Admin-RKPareekCo 那是因为您的目标工作表受到保护,只有您可以编辑它。取消保护工作表(右键单击工作表名称,单击 Protect sheet 并删除保护),或使用您的帐户安装 onEdit 工作表,以便脚本在您的权限下执行。
  • 我尝试了同样的方法来移除保护片,但没有成功。我不明白您给出的第二个选项,即使用您的帐户安装 onEdit 工作表。你能告诉我怎么做吗?
  • @Admin-RKPareekCo 您没有完全解除对工作表的保护。某些范围仍受保护,E、F 和 L 列受保护:i.imgur.com/yrqloik.png。删除这些保护,它将起作用。如果您更喜欢安装 onEdit 触发器,请更改您的函数名称并关注these steps,同时登录您的帐户(受保护工作表完全不受保护的一个帐户)。让我知道这些迹象是否足够,或者您是否需要更多详细信息。
  • @Admin-RKPareekCo 不客气。如果这对您有用,您会考虑接受并赞成这个答案吗? stackoverflow.com/help/someone-answers
猜你喜欢
  • 2020-01-22
  • 2019-05-27
  • 2020-09-17
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多