Google Apps脚本:根据提交的表单生成的单元格值移动行

时间:2013-03-26 13:37:06

标签: forms triggers google-apps-script spreadsheet google-sheets

我有一个名为“产品申请表(回复)”的Google电子表格,其中有3张标签为“表格回复”,“Clifford”和“Jim”

在“表单回复”表单中有3列:“timestamp”,“ProductArtist”和“ProductLabel”

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

E.g。如果单元格值为“华纳”,我希望该行移至“Clifford”, 如果单元格值是“通用”,我希望该行移动到“吉姆”

在完成表格的人员填写“表格回复”表后,立即移动它们也是非常方便的。

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

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

3 个答案:

答案 0 :(得分:4)

如果我正在撰写此代码,那么这就是我要遵循的思维过程。

  

在完成表格的人员填写“表格回复”表后,立即移动它们也是非常方便的。

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

  

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

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

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

将行复制到目标表

要完成此任务,您需要确定目标范围是什么,然后执行以下操作:

destination.setValues([event.values]);

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

剩下的就是工作!

答案 1 :(得分:1)

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

这种方法很棘手的是它为公式的所有单元格提供了一个充满空白字符串的String [] []。如果您使用setFormulas()盲目地将此结果应用于目标,则会删除使用copyTo()setValues()复制的所有非公式内容。

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

答案 2 :(得分:0)

轻松使用功能"查询"作为单元格公式,不需要脚本。

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

在每张纸上使用它。