Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 表单上的应用程序脚本如何将额外数据存储到工作表中?_Google Apps Script_Google Forms - Fatal编程技术网

Google apps script 表单上的应用程序脚本如何将额外数据存储到工作表中?

Google apps script 表单上的应用程序脚本如何将额外数据存储到工作表中?,google-apps-script,google-forms,Google Apps Script,Google Forms,问:附加到表单的AppsScript如何将额外的数据存储到工作表中 情境:我们有一个(长的)谷歌表单,它将许多数据存储到谷歌表单中。通常需要编辑条目,使用原始表单编辑要比直接编辑到工作表中容易得多。(有些项目是文本,有几段长。)我想在电子表格中存储一段额外的数据,特别是编辑器可以使用表单编辑行条目的URL 我已经可以获取所有表单数据,并且可以使用formResponse.getEditResponseUrl()获取正确的URL。我可以通过电子邮件将所有这些信息发送给用户,通常是收集所有表单条目的

问:附加到表单的AppsScript如何将额外的数据存储到工作表中

情境:我们有一个(长的)谷歌表单,它将许多数据存储到谷歌表单中。通常需要编辑条目,使用原始表单编辑要比直接编辑到工作表中容易得多。(有些项目是文本,有几段长。)我想在电子表格中存储一段额外的数据,特别是编辑器可以使用表单编辑行条目的URL

我已经可以获取所有表单数据,并且可以使用formResponse.getEditResponseUrl()获取正确的URL。我可以通过电子邮件将所有这些信息发送给用户,通常是收集所有表单条目的编辑。(感谢StackOverflow中的许多有用的答案让我走到了这一步!)但编辑必须手动复制URL并将其粘贴到电子表格正确行的附加列中

我在类工作表中看到一个向电子表格中添加列的接口,但我不知道如何为表单刚刚存储的特定行填充额外的列。我们已经手动添加了该列,并验证了在通过表单进行编辑时,谷歌不会覆盖该列。如何将这一小块数据存储到工作表中

我错过了什么?任何帮助都将不胜感激。谢谢

[新增澄清2015-02-06]

  • 我们有一个很长的表单,一些人提交,其他人编辑。编辑是使用表单完成的,而不是直接在电子表格中编辑,因此我们需要允许编辑人员重新编辑响应的URL

  • 我想在表单提交期间将该URL存储到电子表格中,以便有权访问表单的编辑可以找到它

  • 在表单端的脚本中,我可以轻松地计算该URL,但现在如何将其存储到另一列的工作表中

  • 目前,在我的表单端脚本中,我获取URL并将其与所有表单数据一起通过电子邮件发送到编辑器的通讯组列表。然后,其中一个编辑器从电子邮件中复制URL并将其粘贴到工作表中。(大多数情况下,输入正确的行,甚至:-)这可能是一个容易出错的手动步骤。)

  • 第二个问题:工作表中的行号与表单.getResponses()中的响应号有什么不同?提交新项目(即新行)和编辑旧项目时,行号和响应号似乎会出现偏移。可以合理地预测编辑器将在其中查找表单数据的工作表行号吗

再次感谢你在这方面给我的帮助。我们有一个可生存的临时解决方案。然而,在接下来的几个月里,将有大约100个表单条目出现,我希望尽可能地对流程进行防错


rick

您可以使用表单提交范围参数获取放置在工作表中的表单数据的行/电子表格范围。然后使用范围偏移方法将数据推入表单数据最后一列之后的列中

请注意,如果使用超链接公式,则必须转义作为参数传递的引号

e、 g


所以,我刚刚偶然发现了你的问题,希望我理解正确

可能的问题:

  • 脚本错误地绑定到表单附带的电子表格,而不是表单本身(据我从您的描述中了解,这不是您的问题)

  • 提交插入和附加列编辑之间的竞争条件,或同时提交之间的竞争条件(参见代码第27-32行)

  • 直接访问电子表格,无需事先从电子表格中选择工作表,即使电子表格仅包含一张工作表!(参见代码第36-37行)

  • 使用列数字索引,而不是相应的列字母作为getRange()方法的参数,该方法只接受列字母AFAIK(请参见代码中的第42-43行)

下面是应该解决所有这些问题的代码(我没有测试过,但它是对非常类似场景的完美工作解决方案的改编):

以下函数必须从表单注册到“表单提交”事件,而不是从电子表格注册!(脚本工具栏->资源->当前项目的触发器->添加新触发器)


对于任何其他问题,只需写一条评论。希望能有所帮助。

因此,基本上,您只需要知道如何获取刚刚写入数据的行号即可。谢谢您的回复,但不是这样。我已经有了我通过电子邮件发送给编辑的行及其所有数据。现在,我想将数据存储到该行的一个额外列中。如果您知道要将数据写入的行号和列号,请首先使用
getRange()
方法:然后设置值:编写一些代码,如果您有特定问题,请将其发布。感谢您提供的指针。我试试。谢谢,但是。很抱歉地报告,我发现的所有内容都要求这样一个脚本从工作表端运行,而不是从表单端运行。我需要的一些信息只能在表单的上下文中使用。正如我所说,谷歌文档的新手。如何从表单导航到工作表或从表单导航到工作表?试图从两个方向到达另一个方向,XXXAp.getActiveXXX()返回null。我们有一个生存的解决办法,但它包含一个手动步骤,我们只是尽快绕过。谢谢你的答复。我可以要求一些澄清吗?谢谢你的回复。我可以要求一些澄清吗?1.在表单上运行的应用程序脚本中,如何获取工作表?我尝试了SpreadsheetApp.getActiveSheet(),但返回空值。2.在您给出的代码示例中,是“数据”
function formProcessing(e){
  var formData = e.values;
  var dataRange = e.range; // gets the range on the spreadsheet
  /*
   do all your processing


 */
  var url = "http://www.google.com"; // whatever url to put in spreadsheet

  // add the url value to the spreadsheet
   formRange.getCell(1,formRange.getLastColumn()).offset(0,1).setValue(url);
    // or if you want a named link
  //formRange.getCell(1,formRange.getLastColumn()).offset(0,1).setFormula("HYPERLINK(\"" + url + "\", \"Edit Form\")");
}
// Converts sheet column numeric index to corresponding column letter
function columnToLetter(column)
{
  var temp, letter = '';
  while (column > 0)
  {
    temp = (column - 1) % 26;
    letter = String.fromCharCode(temp + 65) + letter;
    column = (column - temp - 1) / 26;
  }
  return letter;
}
// Associated the sheet rows with response URLs in an additional column
function onFormSubmit(e)
{
  try
  {
    // Get the response Url, either from FormApp:
    var responseUrl = FormApp.getActiveForm().getEditResponseUrl();
    // Or alternatively get it from the event:
//  var responseUrl e.response.getId().getEditResponseUrl();
    // ....................
    // Other URL processing
    // ....................

    // Get a public lock on this script, because we're about to modify a shared resource.
    var lock = LockService.getPublicLock();
    // Wait for up to 30 seconds for other processes to finish.
    lock.waitLock(30000);
    // Wait for row insertion to finish, so that sheet.getLastRow() method gets the updated number of rows
    Utilities.sleep(1000); // 1 second

    // Here insert the URL to your spreadsheet
    var spreadsheetUrl = "https://docs.google.com/spreadsheets/d/YGUgHi28_gYUffGYGGH_78hkO1Pk/edit";
    // Gets the first sheet inside the spreadsheet (if you have multiple sheets, just change the value [0])
    var sheet = SpreadsheetApp.openByUrl(spreadsheetUrl).getSheets()[0];
    // Get updated number of rows and columns, after form submit inserted the new row
    var lastRow = sheet.getLastRow();
    var lastColumn = sheet.getLastColumn();

    // Get the exact cell, next to the right of the new row, by converting the column index to corresponding letter
    var lastCell = columnToLetter(lastColumn) + lastRow.toString();
    // Set the content of the cell with the new URL
    sheet.getRange(lastCell).setValue(responseUrl);

    // Release the lock so that other processes can continue.
    lock.releaseLock();    
  }
  catch (error)
  {
    // If there's an error, show the error message
    return error.toString();
  }
}