Ich habe diese Funktion, die funktioniert, aber alle Antworten erhalten.Die Methode "getEditResponseUrl" von undefined in Google Apps Script kann nicht aufgerufen werden, wenn Sie das Formular mit der Formular-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
Wie die Tabelle größer wird ich bin mit der Leistung Verzögerung besorgt, damit ich es rationalisieren wollen und ersetzen Sie die Funktion mit ein wie die, unter dem nur die editURL für die letzte Antwort bekommt und nur dann, wenn das Blatt Zelle leer
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
jedoch scheint dies auf der getEditResponseUrl zu brechen. Ich erhalte den folgenden Fehler TypeError: Kann die Methode "getEditResponseUrl" nicht undefiniert aufrufen. (Zeile 100, Datei "Code").
Ich verwendete @SandyGoods Antwort auf this post als eine Referenz. Ich frage mich jedoch, ob ihre Beobachtung über den Ereignisauslöser der Grund dafür ist, warum das so ist. Dies ist die onFormSubmit-Funktion, die ich verwende, um diese und andere Funktionen aufzurufen.
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
ich eine ganze Reihe von Quellen auch 234 gefunden, wo sie die URL zu einer E-Mail anzuhängen, verwenden waren auf der Suche, waren komplexer als mein Anwendungsfall, oder waren unbeantwortet. Ich habe auch einige Lösungen gefunden, um die EditURL zu erhalten, indem ich das Skript an das Formular anbinde, aber da ich den Wert auf dem Blatt speichern möchte, muss er an das Blatt und nicht an das Formular gebunden werden.
UPDATE: Okay, also habe ich versucht, mein Skript an das Formular anstelle des Blattes zu binden, die mir die URL zu sehen, aber jetzt habe ich das Problem in umgekehrter, wo das Formular die Tabellenkalkulationsmethoden wie .getMaxColumns nicht finden kann TypeError: Die Funktion getMaxColumns kann in der Objekttabelle nicht gefunden werden. (Zeile 40, Datei "Code") AND .getActiveRange Methode getActiveRange (number) nicht gefunden. (Zeile 48, Datei "Code"). Hier
ist der Code auf der Formseite
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
So wie ich frage mich, ich eine Variable zwischen der Form und dem Blatt passieren kann. Kann ich das Formularprotokoll irgendwie aus dem Blatt lesen? Kann ich den Wert an das Formularantwort-Array anhängen (Dies würde einige andere Änderungen an den referenzierten Spalten bedeuten, könnte aber funktionieren). Gedanken @Gerneio, @SandyGood, noch jemand?
UPDATE 2: Es schien einen Konflikt mit der Verwendung der Methoden aus der FormApp und der SpreadsheetApp innerhalb der gleichen Funktion.
Die Lösung, die für mich funktionierte, bestand darin, die Tabellenkalkulationsfunktionen (außer dem getActiveSheet) zu modularisieren und die getEditResponseURL-Methode in der onFormSubmit-Funktion zu belassen.
Das Code-Snippet finden Sie unter der Nummer here.
Es gibt zwei onFormSubmit-Ereignisse. Einer wird in dem Blatt enthalten sein, das an das Formular angehängt ist, ein anderer wird an das Formular selbst angehängt. Welche gilt für dich? – Gerneio
Momentan verwende ich onFormSubmit, das an das Blatt gebunden ist, weil ich vom Blatt lese und schreibe, – SavageTiner
Der Code sieht in Ordnung für mich aus. Daher scheint die Methode "getEditResponseUrl" von undefined nicht aufgerufen zu werden, als ob sie mit Daten und nicht mit dem Code zusammenhängt. Wenn keine Antworten vorhanden sind, wird ein Fehler angezeigt. Sie können die Anweisungen 'Logger.log()' und den Operator 'typeof' verwenden, um den Datentyp einer Variablen zu überprüfen. 'Logger.log ('typeof form:' + typeof form)' Dann im Menü Ansicht, überprüfen Sie die Protokolle. Wenn das Formular nicht abgerufen wurde oder keine Formularantworten vorliegen, sollten Sie trotzdem Konditionstests durchführen. Damit Ihr Code bei einem Problem fehlerfrei ausgeführt werden kann. –