2017-05-21 3 views
2

Ich habe eine Liste von Google Forms in einer Spalte in einer Google-Tabelle. Und ich muss den Namen der Tabellenkalkulations-Registerkarte abrufen, die das Antwortziel für jedes der Formulare ist. das Element jeder Zelle der Liste der FormulareSo erhalten Sie den Namen des Tabellendokuments eines Google-Formularziels mithilfe von Apps Script

In einer for-Schleife, die auf der Liste der Formulare läuft, bin ich mit

for(i = 1; i < length-of-thelist, i++) { 

var form = FormApp.openByUrl(url); //Line1 
var destId = form.getDestinationId(); //Line2 
var sheetName = SpreadsheetApp.openById(destId).getSheetName(); //Line3 
//..... other lines to print the sheet name ...... 

} 

Zeile 1, i als url bin vorbei.

Aber das gibt mir einen Fehler "Kein Element mit der angegebenen ID konnte gefunden werden, oder Sie haben keine Berechtigung, darauf zuzugreifen." Und das passiert auf Line1.

Der zweite Teil des Fehlers ("Sie haben keine Berechtigung ...") ist nicht wahr, weil ich der Besitzer des Blattes bin, das die Liste der Formulare sowie die Formulare selbst enthält.

Gibt es eine Möglichkeit, dass ich das bekommen kann?

+0

Ich würde Bindestriche in Variablennamen vermeiden - es macht den Code ziemlich umständlich zu lesen. – Ryan

+0

Danke Ryan. Ich bedanke mich für ihre Rückmeldung! – Krishna

+0

Danke Rubén, für die Änderungen. – Krishna

Antwort

2

Leider gibt die Methode getDestinationId() die ID der Tabelle zurück, nicht das spezifische Blatt, an das das Formular gebunden ist. Ich würde Ihnen empfehlen, den Blattnamen oder die ID zusammen mit den Formular-IDs zu speichern, die Sie aufgelistet haben. Anschließend können Sie diese Zeilen durchlaufen und den entsprechenden Blattnamen/die ID nach Bedarf abrufen.

+0

Danke Dimu. Ich habe das ein bisschen weiter recherchiert und festgestellt, dass es eine Antwort gibt. Bitte sehen Sie, ich habe versucht, meine eigene Frage zu beantworten (nicht sicher, ob das eine gute Übung ist, obwohl :)))). – Krishna

1

Ich habe das gebaut und scheint zu arbeiten.

function destinationTabName() { 
    var master_file = DriveApp.getFileById('1zwTluWabUdHxxxxxxxxxxxxxxx'); //reading the active spreadsheet 
    var master_doc_id = master_file.getId(); //getting the file id 


    var ss = SpreadsheetApp.openById(master_doc_id); 
    SpreadsheetApp.setActiveSpreadsheet(ss); 


    var sheet = ss.getSheetByName("Sheet1"); // Let us assume Sheet1 is the name of the tab in which we want to output the name of the tab which is the form destination 
    var sheetArray = sheet.getDataRange().getValues(); 



    var sheets = ss.getSheets(); 
    sheet.getRange(sheetArray.length+1, column#).setValue(sheets[0].getName()); 

} 

Bitte beachten Sie, dass Blätter [0] in diesem Fall funktioniert, weil ich das Formular Ziel zu erzeugen bin mit form.setDestination (FormApp.DestinationType.SPREADSHEET, ss.getId()); Dadurch wird eine Registerkarte mit dem Namen "Formularantworten xx" erstellt, bei der es sich immer um die erste Registerkarte in der Tabelle handelt. Der obige Code funktioniert also nur dann ordnungsgemäß, wenn er ausgeführt wird, bevor Änderungen an der Reihenfolge der Registerkarten im Blatt vorgenommen werden (absichtlich, beabsichtigt oder versehentlich).

Bitte beachten Sie auch, dass ich gezwungen bin, eine separate Funktion wie diese zu verwenden, weil die Funktion, die form.setDestination (FormApp.DestinationType.SPREADSHEET, ss.getId()) enthält, einen Fehler verursacht, der das Blatt neu lädt . Wenn dies geschieht, registriert die Funktionalität der Funktion destinationTabName() tatsächlich eine frühere Registerkarte im Arbeitsblatt als Arbeitsblatt [0].

Aber insgesamt funktioniert die Problemumgehung für mich für jetzt.

Hinweis: Im Bereich ohne Code, wenn ich "Blatt" sage, meine ich die gesamte Google Sheets-Arbeitsmappe. "Tab" = die einzelnen Registerkarten der Arbeitsmappe.

Verwandte Themen