Forms 根据提交表单生成的单元格值移动行

Forms 根据提交表单生成的单元格值移动行,forms,google-apps-script,google-sheets,triggers,Forms,Google Apps Script,Google Sheets,Triggers,我有一个名为产品申请表(回复)的谷歌电子表格,有三张标签为表单回复,Clifford和Jim。在表单响应表中有三列:时间戳、产品艺术家和产品标签 我希望根据ProductLabel下的单元格值,将整行移动/剪切到Clifford或Jim工作表。例如,如果单元格值为Warner我希望该行移到Clifford,如果单元格值为Universal我希望该行移到Jim 当有人填写表单时,一旦填写了表单响应,将其移动也会非常方便 function onEdit(event) { var ss = Spr

我有一个名为
产品申请表(回复)
的谷歌电子表格,有三张标签为
表单回复
Clifford
Jim
。在
表单响应
表中有三列:
时间戳
产品艺术家
产品标签

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

当有人填写表单时,一旦填写了表单响应,将其移动也会非常方便

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

我仍然觉得很难理解如何编写“表单提交”脚本。我已经找到了一个类似的脚本,它在编辑单元格值时有效,但在提交表单时创建行时无效。

如果我正在编写此代码,下面是我将遵循的思考过程

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);
  }
}
一旦有人填写了“表单响应”表,将其移动也会非常方便

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);
  }
}
您可以编写一个在提交表单时自动触发的函数。它将收到一个事件,其中包含有关提交的信息(表单值&它们在响应表中插入的范围)

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

因为这些值是在表单提交时随事件一起提供的,所以很容易将信息复制到其他表单。下面的骨架函数根据<代码>产品标签进行决策,并且它的设置是为了方便地考虑该列的两个以上值。它还没有将新表单数据复制到目标工作表的代码(但它将在退出之前删除输入)。就个人而言,我倾向于在源工作表中添加一个非表单列,并在处理新表单输入后使用它记录“状态”,但我们还是按要求使用“移动”或“复制然后删除”

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


剩下的就是工作了

如果我在写这段代码,下面是我的思考过程

一旦有人填写了“表单响应”表,将其移动也会非常方便

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);
  }
}
您可以编写一个在提交表单时自动触发的函数。它将收到一个事件,其中包含有关提交的信息(表单值&它们在响应表中插入的范围)

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

因为这些值是在表单提交时随事件一起提供的,所以很容易将信息复制到其他表单。下面的骨架函数根据<代码>产品标签进行决策,并且它的设置是为了方便地考虑该列的两个以上值。它还没有将新表单数据复制到目标工作表的代码(但它将在退出之前删除输入)。就个人而言,我倾向于在源工作表中添加一个非表单列,并在处理新表单输入后使用它记录“状态”,但我们还是按要求使用“移动”或“复制然后删除”

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

剩下的就是工作了

简单,只需将函数“query”用作单元格公式,无需脚本

=query (base! A1:x; "select * where c='blah' ...")
在每张纸上使用它。

简单,只需将函数“query”用作单元格公式,无需脚本

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

在每张工作表上使用它。

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

此方法的棘手之处在于,它为所有非公式的单元格提供了一个充满空白字符串的字符串[]。如果您盲目地使用<