0

我有一个名为的谷歌电子表格Product Request Form (Responses),其中三张标签分别Form ResponsesCliffordJim。在Form Responses工作表中有三列timestampProductArtistProductLabel

我希望将整行移动/剪切CliffordJim基于ProductLabel. 例如,如果单元格值为Warner我希望将行移至Clifford,如果单元格值为Universal我希望该行移至Jim

Form Responses在有人填写表格后立即将它们移动到 extermley 也很方便。

function onEdit(event) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  if(s.getName() == "Form Responses" && r.getColumn() == 6 && r.getValue() == "Warner") {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Clifford");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);
  }
}

我仍然很难理解如何编写“表单提交”脚本。我设法找到了一个类似的脚本,该脚本在编辑单元格值时有效,但是在提交表单时创建行时它不起作用。

4

3 回答 3

4

如果我正在编写这段代码,这就是我要遵循的思考过程。

一旦有人填写表格时填写“表格回复”表,让他们移动也很方便。

您可以编写一个在提交表单时自动触发的函数。它将收到一个事件,其中包含有关提交的信息(表单值和它们在响应表中插入的范围)。

我希望根据“ProductLabel”下的单元格值将整行移动/剪切到“Clifford”或“Jim”表

因为这些值是在表单提交时提供的事件中提供的,所以很容易将信息复制到其他工作表。以下骨架函数基于ProductLabel- 做出决定,并且它的设置很容易演变为考虑该列的两个以上的值。它还没有将新表单数据复制到目标工作表的代码(它会在退出之前删除输入)。就个人而言,我倾向于在源工作表中添加一个非表单列,并在处理新表单输入后使用它来记录“状态”,但让我们坚持使用“移动”或“复制然后删除” ”,如被问及。

function handleNewForm(event) {
  switch (event.namedValues.ProductLabel) {
    case "Warner":
      // write event.values to "Clifford" Sheet.
      break;
    case "Universal":
      // write event.values to "Jim" Sheet.
      break;
    default:
      // Unexpected input, needs to be handled
      break;
  }
  // We have the range that contained the input, we can clear it.
  // There are side-effects to this that you might not want.
  event.range.clear();
}

将行复制到目标工作表

为此,您需要弄清楚目标 Range 是什么,然后执行以下操作:

destination.setValues([event.values]);

要获取目标范围,您需要打开相应的工作表,找出现有数据范围(以及下一个可用行),然后使用它来获取destination. 为了.setValues()工作,destination必须具有与写入它的二维数组相同的维度。event.values参数是一维数组——一行。为了把它变成一个二维数组,我们只需将它写为一个新数组中的唯一元素,它代表行。因此,要写入[event.values]目标工作表,我们需要 1 行 x 3 列的范围。

剩下的就是工作!

于 2013-03-26T15:45:26.020 回答
1

请注意,如果您使用查询函数复制数据,则查询仅获取源单元格中的文字文本/值。例如,如果您的数据中有 =HYPERLINK(),则使用查询复制数据将去除链接,只留下锚文本。要复制有效的公式,您需要使用getFormulas() 方法

这种方法的棘手之处在于它为所有不是公式的单元格提供了一个充满空白字符串的 String[][]。如果你盲目地将这个结果应用到目标上,你会清空使用orsetFormulas()复制的所有非公式内容。 copyTo()setValues()

这是一个关于合并值和公式数组的代码的讨论,然后您可以使用setValues()同一工作簿中的方法应用这些代码。将数据移动到不同工作簿中的工作表需要更多的低级工作。

于 2014-08-23T11:13:20.863 回答
0

只需使用函数“查询”作为单元格公式即可,无需脚本。

=query (base! A1:x; "select * where c='blah' ...")

在每张纸上使用它。

于 2013-03-27T01:34:13.120 回答