3

我正在尝试创建一个脚本,该脚本将采用新的表单响应并根据提交的信息将其移动到另一个工作表。例如,假设表单有两个答案选项 A、B。电子表格有三张表;表格回复,表格 A,表格 B。如果有人提交表格并选择 A,我需要将该新行从“表格回复”移动到“表格 A”。我发现别人的脚本正是这样做的,但使用了 OnEdit 函数。当提交新的表单响应时,我无法弄清楚如何修改此脚本以使其正常工作。

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

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

我使用了可安装的触发器并用 onFormSubmit 替换了 OnEdit 函数,但这不起作用。如果有人可以帮助我,我将不胜感激。

谢谢,

4

4 回答 4

0

我有一个收集表单提交的电子表格,然后有额外的表格根据答案过滤掉这些提交。所有这些都只是公式。这也能解决问题吗?

于 2013-04-03T12:52:02.820 回答
0

在比较变量时尝试一些不那么广泛的东西,例如,提交提交的工作表是一个常量并且已经是地址。

function formSubmission() {
 var s = SpreadsheetApp.getActiveSheet();
 var data = range.getValues(); // range is a constant that always contains the submitted answers
 var numCol = range.getLastColumn();
 var row = s.getActiveRow;
 var targetinfo = s.getRange(row,(Yourcolumn#here).getValue);
    if(targetinfo() == "Desired Sheet Name") {
      var targetSheet = ss.getSheetByName("Sheet A");
      var targetrow = targetSheet.getLastrow()+1);
      var Targetcol = numCol();
      targetSheet.getRange(targetrow,1,1,Targetcol).setValues(data);
     }
  }

我没有对此进行测试,但希望它有助于在我最近发现的开发人员指南中查找事件对象,并且它澄清了很多

于 2017-01-29T23:59:48.287 回答
0

可以通过以下方式设置触发器:在此处输入图像描述 然后设置它:在此处输入图像描述

于 2017-04-15T17:42:47.410 回答
0

为了实现你想要的,你需要:

  1. 创建一个函数write_to_new_sheet,每当新的响应到达表单时,我们将在触发器函数中使用该函数。此函数将表单响应作为事件对象e
function write_to_new_sheet(e){
  let responses = e.response.getItemResponses()
  let new_row = get_new_response_data_as_row(responses)
  let sheet_to_write = SpreadsheetApp.openById('your spreadsheet id').getSheetByName('sheet A') // or 'sheet B', you can set this dynamically by checking the new_row, corresponding to the response as a gsheet row
  write_values_in_first_row(sheet_to_write, new_row)
}

这是辅助功能write_to_new_sheet

function get_new_response_data_as_row(responses){
  let new_row = []
  responses.forEach(response => {
     new_row.push(response.getResponse())
  })
  return new_row
}

function write_values_in_first_row(sheet, new_row_values){
  let row_to_write_from = 2 // assuming you have a header
  let sheet_with_new_row = sheet.insertRowBefore(row_to_write_from)
  let number_of_rows = 1
  let number_of_columns = new_row_values.length
  let range = sheet_with_new_row.getRange(row_to_write_from, 1, number_of_rows, number_of_columns)
  let results =range.setValues([new_row_values])
  return new_row_values
}

  1. 设置一个可安装的触发器,该触发器在您向表单提交新响应时起作用:
function setup_write_to_new_sheet_on_form_submit(){
  ScriptApp.newTrigger('write_to_new_sheet')
  .forForm('your form id goes here')
  .onFormSubmit()
  .create();
}
  1. 运行上述函数一次,设置触发器。
  2. 尝试在表单上提交新的回复,并检查您希望写入的表单中的更改。
于 2022-02-15T13:08:40.720 回答