【问题标题】:Move row based on cell value generated by submitted form根据提交的表单生成的单元格值移动行
【发布时间】:2013-03-26 13:37:06
【问题描述】:

我有一个名为 Product Request Form (Responses) 的 Google 电子表格,其中包含三个标签为 Form ResponsesCliffordJim 的工作表。在Form Responses 表中有三列:timestampProductArtistProductLabel

我希望根据ProductLabel 下的单元格值将整行移动/剪切到CliffordJim 工作表。例如。如果单元格值为Warner,我希望该行移至Clifford,如果单元格值为Universal,我希望该行移至Jim

一旦有人填写了表格Form Responses,就可以方便地移动它们。

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

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

【问题讨论】:

  • 你已经尝试过什么?你有代码可以做一些你想要的吗?因为正如它所说,这个问题似乎是一个为你做功课的请求。
  • 阅读有关可安装触发器的链接。在脚本编辑器中,您需要打开“资源”、“当前项目的触发器”,然后添加一个。您将指明函数名称和触发器的性质(表单提交)。 “onEdit”触发器不会在表单提交时触发,请参阅this answer 了解更多信息。

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


【解决方案1】:

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

一旦有人填写了“表单回复”表,就可以将它们移走也很方便。

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

我希望根据“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 列的范围。

剩下的就是工作!

【讨论】:

  • 剩下的就是工作!(我喜欢它;-)很好的答案。+1
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    在每张纸上使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      • 1970-01-01
      相关资源
      最近更新 更多