无法调用方法" getEditResponseUrl"在使用表单ID打开表单时绑定到Sheet的Google Apps脚本上的未定义

时间:2016-04-13 18:42:28

标签: javascript google-apps-script google-form

我有这个功能,但它可以获得所有响应。

function setEditUrl(ss, createDateColumn)
{
  var formURL = 'https://docs.google.com/forms/d/101bMiRw9TQaGbdDc4U_tLAD0QzicqejM9qXOEwJPQKU/viewform';
  var urlColumn = createDateColumn-2;
  var data = ss.getDataRange().getValues();
  var form = FormApp.openByUrl(formURL);
  for(var i = 2; i < data.length; i++) 
  {
    if(data[i][0] != '' && data[i][urlColumn-1] == '') 
    {
      var timestamp = data[i][0];
      var formSubmitted = form.getResponses(timestamp);
      if(formSubmitted.length < 1) continue;
      var editResponseUrl = formSubmitted[0].getEditResponseUrl();
      ss.getRange(i+1, urlColumn).setValue(editResponseUrl);
    }//end of if
  }//end of for
  return;
}// This is the end of the setEditUrl function

随着电子表格变得越来越大,我担心性能滞后,所以我想简化它并将函数替换为下面的函数,只需获取最后一个响应的editURL,并且仅当表格单元格为空时

function setGoogleFormURL(ss, lastRowInx, createDateColumn)
{
  var urlColumn = createDateColumn-2;

  if (ss.getRange(lastRowInx, urlColumn).getValue() == "") // so that subsequent edits to Google Form don't overwrite editResponseURL
  {
    var form = FormApp.openById('101bMiRw9TQaGbdDc4U_tLAD0QzicqejM9qXOEwJPQKU');
    var formResponses = form.getResponses();
    var lastResponseIndex = form.getResponses.length-1;
    var lastResponse = formResponses[lastResponseIndex];
    var editResponseUrl = lastResponse.getEditResponseUrl();
    var createEditResponseUrl = ss.getRange(lastRowInx, urlColumn);
    createEditResponseUrl.setValue(editResponseUrl);  
  }
  else{} //do nothing

但是这似乎在getEditResponseUrl上破坏了。我收到以下错误TypeError:无法调用方法&#34; getEditResponseUrl&#34;未定义的。 (第100行,文件&#34;代码&#34;)。

我使用@SandyGood对this post的回答作为参考。我想知道,如果她对事件触发器的观察是为什么这是borking。这是我用来调用这个和其他函数的onFormSubmit函数。

    function onFormSubmit(e) 
{
 var ss = SpreadsheetApp.getActiveSheet();
 var lastRowInx = ss.getLastRow(); // Get the row number of the last row with content
 var createDateColumn = ss.getMaxColumns(); //CreateDateColumn is currently in AX (Column 50) which is the last/max column position

 var createDate = setCreateDate(ss, lastRowInx, createDateColumn);
 var trackingNumber = setTrackingNumber(ss, lastRowInx, createDateColumn);
 //var editURL = setEditUrl(ss, createDateColumn);
 var editResponseURL = setGoogleFormURL(ss, lastRowInx, createDateColumn);

 }//This is the end of onFormSubmit

我还发现了很多来源2 3 4,他们在那里使用网址附加到电子邮件,比我的用例更复杂,或者没有回复。我还找到了一些通过将脚本绑定到表单来获取EditURL的解决方案,但由于我想将值存储在工作表上,因此需要将其绑定到工作表而不是表单。

更新: 好的,所以我试图将我的脚本绑定到表单而不是表单允许我查看URL,但现在我有相反的问题,表单无法找到电子表格方法,如.getMaxColumns TypeError:找不到函数对象Spreadsheet中的getMaxColumns。 (第40行,文件&#34;代码&#34;)和.getActiveRange找不到方法getActiveRange(number)。 (第48行,文件&#34;代码&#34;)。

以下是表单方面的代码

function onFormSubmit(e)
{
  var form = FormApp.getActiveForm();
  var activeFormUrl = form.getEditUrl();
  var ss = SpreadsheetApp.openById(form.getDestinationId());
  var createDateColumn = ss.getMaxColumns(); //CreateDateColumn is currently in AY (Column 51) which is the last/max column position
  var urlColumn = createDateColumn-1; //urlColumn is currently in AX (Column 50) Calculating using it's relative position to createDateColumn Position

  Logger.log(activeFormUrl, createDateColumn, urlColumn);
  var checkLog1 = Logger.getLog();
  Logger.clear();

  if (ss.getActiveRange(urlColumn).getValue() == "") // so that subsequent edits to Google Form don't overwrite editResponseURL
  {
    var editResponseURL = setGoogleFormEditUrl(ss, createDateColumn, activeFormUrl);
    var createEditResponseUrl = ss.getActiveRange(urlColumn);
    createEditResponseUrl.setValue(activeFormUrl);  
  }
  else
  {
    if (ss.getActiveRange(urlColumn).getValue() != activeFormUrl)
    { 
      Logger.log("Something went wrong - URL doesn't match")
      Logger.log(ss.getActiveRange(urlColumn).getValue());
      var checkLog2 = Logger.getLog();
    }
  else {}//do nothing
  }   
}//This is the end of the onFormSubmit function

所以我想知道如何在表单和表单之间传递变量。我可以以某种方式从表单中以程序方式读取表单日志吗?我可以将值附加到表单响应数组(这将意味着对引用的列进行一些其他编辑但可以工作)。想想@Gerneio,@ SandyGood,其他人?

更新2: 在同一函数中使用FormApp和SpreadsheetApp中的方法似乎存在冲突。

对我有用的解决方案是将电子表格函数模块化(getActiveSheet除外)并将getEditResponseURL方法保留在onFormSubmit函数中。

可以找到here张贴的代码段。

2 个答案:

答案 0 :(得分:1)

我建议尝试在表单端使用onFormSubmit(e)。

function onFormSubmit(e)
{
  var form = e.source;
  var response = e.response;
  var sheet = SpreadsheetApp.openById(form.getDestinationId());
  var editUrl = response.getEditResponseUrl();
  Logger.log(editUrl); // check the logger to see what results you are getting now
  // Then do whatever operations you need to do...
}

<强>更新

我不太确定你为什么会遇到这么多问题,但我可以肯定地告诉你,它可以从任何一方,表格或电子表格中完成。我只是将一个工作示例放在一起,其中包含在电子表格方面编写的代码,而在表单方面则没有。看看:

function onFormSubmit(e) 
{
  var rng = e.range;
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var fUrl = ss.getFormUrl();
  var f = FormApp.openByUrl(fUrl);

  var rs = f.getResponses();  
  var r = rs[rs.length - 1]; // Get last response made

  var c = getCellRngByCol(rng, 'Edit Response URL');  
  c.setValue(r.getEditResponseUrl());
}

// Specific for a form submit trigger
// Pass e.range and the name of the column
// to return a single cell
function getCellRngByCol(rng, col)
{
  var aRng = SpreadsheetApp.getActiveSheet().getDataRange();
  var hRng = aRng.offset(0, 0, 1, aRng.getNumColumns()).getValues();
  var colIndex = hRng[0].indexOf(col);

  return SpreadsheetApp.getActiveSheet().getRange(rng.getRow(), colIndex + 1);
}

我遇到了一些小小的打嗝。首先,确保相应地设置触发器。我强烈建议立即设置故障通知。其次,即使函数依赖于传递的事件,在提交表单之前至少手动运行onFormSubmit(e)方法一次。它将检查您的脚本是否需要任何授权,并在需要时进行请求。我还建议您打开一个新表单,链接一个全新的电子表格,并测试此代码以确保其有效。然后塑造上面的代码以满足您的需求。

如果你无法得到它,那么我将分享一个有效的例子。

答案 1 :(得分:0)

在同一个函数中使用FormApp和SpreadsheetApp中的方法似乎存在冲突。

对我有用的解决方案是将电子表格函数模块化(getActiveSheet除外)并将getEditResponseURL方法保留在onFormSubmit函数中。

可以找到here发布的代码段。