使用表单 ID 打开表单时,无法在绑定到 Sheet 的 Google Apps 脚本上调用未定义的方法 "getEditResponseUrl"
Cannot call method "getEditResponseUrl" of undefined on Google Apps Script bound to Sheet when opening form using form ID
我有这个功能,但它得到了所有响应。
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
随着 spreadsheet 变大,我担心性能滞后,所以我想简化它并用下面的函数替换函数,它只得到最后一个 editURL响应且仅当 sheet 单元格为空时
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 上中断。我收到以下错误类型错误:无法调用未定义的方法 "getEditResponseUrl"。 (第 100 行,文件 "Code")。
我使用@SandyGood 对 this post 的回答作为参考。我想知道她对事件触发器的观察是否就是为什么这很无聊。这是我用来调用此函数和其他函数的 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
我还发现了一大堆来源 234 他们正在寻找使用 URL 附加到电子邮件的来源,这些来源比我的用例更复杂,或者没有得到答复。我还找到了一些通过将脚本绑定到表单来获取 EditURL 的解决方案,但由于我想将值存储在 sheet 上,因此需要绑定到 sheet 而不是表格。
更新:
好的,所以我尝试将我的脚本绑定到表单而不是 sheet 这让我看到了 URL 但现在我遇到了相反的问题,即表单找不到传播 sheet 类似 .getMaxColumns TypeError 的方法:无法在对象 Spreadsheet 中找到函数 getMaxColumns。 (第 40 行,文件 "Code")和 .getActiveRange 找不到方法 getActiveRange(number)。 (第 48 行,文件 "Code")。
这是表单端的代码
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
所以我想知道如何在表单和 sheet 之间传递变量。我能以某种方式从 sheet 中以编程方式读取表单日志吗?我可以将该值附加到表单响应数组吗(这意味着对引用的列进行一些其他编辑但可以工作)。 @Gerneio 的想法,@SandyGood,还有其他人吗?
更新 2:
在同一个函数中同时使用 FormApp 和 SpreadsheetApp 的方法似乎存在冲突。
对我有用的解决方案是将 spreadsheet 函数模块化(getActiveSheet 除外)并将 getEditResponseURL 方法留在 onFormSubmit 函数中。
可以在发布的 中找到代码片段。
我建议尝试在表单端使用 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...
}
更新:
我不太确定为什么您对此有这么多问题,但我可以肯定地告诉您,它可以从表单或电子表格的任何一方完成。我只是将一个工作示例与在电子表格端编写的代码放在一起,none 无论如何在表单端。看看:
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) 方法一次。它将检查您的脚本是否需要任何授权,并在需要时提出请求。我还建议您打开一个新表单,link 一个全新的电子表格,并测试此代码以确保其正常工作。然后根据您的需要塑造上面的代码。
如果你看不懂,那我来分享一个有效的例子。
在同一个函数中同时使用 FormApp 和 SpreadsheetApp 的方法似乎有冲突。
对我有用的解决方案是将电子表格功能模块化(getActiveSheet 除外)并将 getEditResponseURL 方法留在 onFormSubmit 函数中。
可以在 .
中找到代码片段
我有这个功能,但它得到了所有响应。
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
随着 spreadsheet 变大,我担心性能滞后,所以我想简化它并用下面的函数替换函数,它只得到最后一个 editURL响应且仅当 sheet 单元格为空时
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 上中断。我收到以下错误类型错误:无法调用未定义的方法 "getEditResponseUrl"。 (第 100 行,文件 "Code")。
我使用@SandyGood 对 this post 的回答作为参考。我想知道她对事件触发器的观察是否就是为什么这很无聊。这是我用来调用此函数和其他函数的 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
我还发现了一大堆来源 234 他们正在寻找使用 URL 附加到电子邮件的来源,这些来源比我的用例更复杂,或者没有得到答复。我还找到了一些通过将脚本绑定到表单来获取 EditURL 的解决方案,但由于我想将值存储在 sheet 上,因此需要绑定到 sheet 而不是表格。
更新: 好的,所以我尝试将我的脚本绑定到表单而不是 sheet 这让我看到了 URL 但现在我遇到了相反的问题,即表单找不到传播 sheet 类似 .getMaxColumns TypeError 的方法:无法在对象 Spreadsheet 中找到函数 getMaxColumns。 (第 40 行,文件 "Code")和 .getActiveRange 找不到方法 getActiveRange(number)。 (第 48 行,文件 "Code")。
这是表单端的代码
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
所以我想知道如何在表单和 sheet 之间传递变量。我能以某种方式从 sheet 中以编程方式读取表单日志吗?我可以将该值附加到表单响应数组吗(这意味着对引用的列进行一些其他编辑但可以工作)。 @Gerneio 的想法,@SandyGood,还有其他人吗?
更新 2: 在同一个函数中同时使用 FormApp 和 SpreadsheetApp 的方法似乎存在冲突。
对我有用的解决方案是将 spreadsheet 函数模块化(getActiveSheet 除外)并将 getEditResponseURL 方法留在 onFormSubmit 函数中。
可以在发布的
我建议尝试在表单端使用 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...
}
更新:
我不太确定为什么您对此有这么多问题,但我可以肯定地告诉您,它可以从表单或电子表格的任何一方完成。我只是将一个工作示例与在电子表格端编写的代码放在一起,none 无论如何在表单端。看看:
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) 方法一次。它将检查您的脚本是否需要任何授权,并在需要时提出请求。我还建议您打开一个新表单,link 一个全新的电子表格,并测试此代码以确保其正常工作。然后根据您的需要塑造上面的代码。
如果你看不懂,那我来分享一个有效的例子。
在同一个函数中同时使用 FormApp 和 SpreadsheetApp 的方法似乎有冲突。
对我有用的解决方案是将电子表格功能模块化(getActiveSheet 除外)并将 getEditResponseURL 方法留在 onFormSubmit 函数中。
可以在