2016-04-13 6 views
0
öffnen.

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.

+0

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

+0

Momentan verwende ich onFormSubmit, das an das Blatt gebunden ist, weil ich vom Blatt lese und schreibe, – SavageTiner

+1

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. –

Antwort

0

Es schien einen Konflikt mit der Verwendung der beiden Methoden FormApp und SpreadsheetApp innerhalb derselben Funktion zu geben.

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.

1

Ich würde vorschlagen, den onFormSubmit (e) auf der Formularseite zu verwenden.

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... 
} 

Update:

Ich bin nicht so sicher, warum Sie so viele Probleme mit diesem haben, aber ich kann Ihnen sicher sagen, dass es von beiden Seiten durchgeführt werden kann, das Formular oder Kalkulationstabelle. Ich habe nur ein funktionierendes Beispiel mit Code geschrieben, der auf der Spreadsheet-Seite geschrieben ist, aber nichts auf der Form-Seite.Schau es dir an:

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); 
} 

Es gab ein paar kleine Schluckauf, denen ich begegnete. Stellen Sie zunächst sicher, dass Sie den Trigger entsprechend einrichten. Ich empfehle dringend, sofortige Benachrichtigungen über Fehler einzurichten. Zweitens, obwohl die Funktion sich auf das übergebene Ereignis verlässt, führen Sie die onFormSubmit (e) -Methode mindestens einmal manuell aus, bevor Sie ein Formular absenden. Es wird überprüft, ob Ihr Skript eine Autorisierung benötigt und wird bei Bedarf angefordert. Ich würde auch empfehlen, dass Sie ein neues Formular öffnen, eine neue neue Tabelle verknüpfen und diesen Code testen, um sicherzustellen, dass es funktioniert. Dann formen Sie den obigen Code nach Ihren Bedürfnissen.

Wenn Sie es nicht bekommen, dann werde ich ein funktionierendes Beispiel teilen.

+0

Ich habe versucht, es auf der Formularseite hinzuzufügen, aber jetzt bekomme ich den umgekehrten Fehler, weil es Methoden nicht finden kann, die bei der Verarbeitung auf der Blatt-Seite verwendet werden. Ich habe den Post mit dem neuen Code aktualisiert. Ich habe auch eine neue Frage gestellt, die verwandt ist, aber sie auf andere Weise anspricht http://stackoverflow.com/questions/36801377/how-can-i-pass-a-variable-between-a-google-form-bound- script-und-google-sheet-bo – SavageTiner