2016-05-30 3 views
0

Ich erstelle eine Seitenleiste in einem Google-Blatt. Ich habe kein Problem, es mit Auswahllisten erscheinen zu lassen. Ich versuche, die Auswahllisten basierend auf einem Bereich in einem der Blätter aufzufüllen. Ich habe zahlreiche Vorschläge von stackoverflow ausprobiert und die Google-Dokumentation für den HTML-Service mehrmals gelesen. Mir scheint immer noch etwas zu fehlen. Nach meinen Tests scheint der google.script.run-Aufruf an den Server nie ausgeführt zu werden. Hier ist meine code.gs Datei:Google Apps Script Server-Aufruf zum Auffüllen der Auswahlliste läuft nie

function onOpen() { 
    var ui = SpreadsheetApp.getUi(); 
    ui.createMenu('Schedule') 
     .addItem('New schedule', 'newSchedule') 
     .addItem('Edit start date', 'newDate') 
     .addSeparator() 
     .addItem('Insert names', 'openInsert') 
     .addToUi(); 
} 


function openInsert() { 
    var html = HtmlService.createHtmlOutputFromFile('Insert') 
    .setSandboxMode(HtmlService.SandboxMode.IFRAME) 
    .setTitle('Insert Names') 
    .setWidth(300); 
    SpreadsheetApp.getUi() 
    .showSidebar(html); 
} 


function getNames() { 
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Publishers"); 
    var names = sheet.getRange(2, 1, sheet.getLastRow(),1).getValues(); 
    return names; 
} 

Hier ist meine insert.html Datei:

<!DOCTYPE html> 
    <html> 
    <head> 

    <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css"> 

    <script> 

    function returnedNames(names) { 
    var selectList = new Array("publisher1","publisher2","publisher3"); 

    for (sel in selectList) { 
     var dropDown = document.getElementById(sel); 

     for (i = 0; i < names.length; i++) { 
     var opt = document.createElement("option"); 
     opt.text = names[i][0]; 
     opt.values = names[i][0]; 
     dropDown.options.add(opt); 
     } 
    } 
    } 

    google.script.run.withSuccessHandler(returnedNames).getNames(); 

    </script> 

    </head> 

    <body> 

    <div class="block form-group"> 
    <label for="publisher1">First publisher</label> 
    <select id="publisher1"> </select> 
    <label for="publisher2">Second publisher</label> 
    <select id="publisher2"> </select> 
    <label for="publisher3">Third publisher (optional)</label> 
    <select id="publisher3"> </select> 
    </div> 

    </body> 

</html> 

Antwort

1

Ich glaube, Ihre Server-Funktion aufgerufen wird, bevor das Dokument tatsächlich bereit ist, dem gearbeitet werden soll. Ich würde mir vorstellen, dass wenn Sie das Browser-Konsolenfenster mit den Entwicklertools überprüfen würden, ein Fehler auftauchen würde.

Da Sie im Wesentlichen diese aufgefüllten Onloads möchten, fügen Sie dem body-Tag ein load-Ereignis hinzu. Lassen Sie dieses Ereignis Ihre Serverfunktion aufrufen. Wenn dies nicht funktioniert, verwenden Sie eine Kombination aus Logger.log auf der Serverseite und console.log auf der Client-Seite durch Ihre Code-Sequenz und sehen Sie, was Sie erhalten und welchen Pfad Ihr Code verfolgt.

+0

Das ist, was ich dachte, dass die Funktion aufgerufen wird, bevor das Dokument bereit ist. Ich habe bereits versucht, ein Load-Event zum Body-Tag hinzuzufügen, aber es hat nicht funktioniert. Ich werde es wieder versuchen, falls ich es vorher falsch gemacht habe. Ich werde Ihren Vorschlag der Protokollierung versuchen, um den Pfad zu sehen. Gibt es andere Methoden, um sicherzustellen, dass die Funktion zum richtigen Zeitpunkt ausgelöst wird? Die meisten Codebeispiele verwenden eine Schaltfläche, aber ein Load-Ereignis wäre besser geeignet. – Mattestion

+0

Ich glaube, JQuery hat ein Dokument bereit Ereignis, so ziemlich wie Onload. Sie könnten auch versuchen, die Fehlerbehandlungsroutinen für Google.script.run zu verwenden, um auch den Pfad des Codes zu verfolgen, falls ein Fehler auftritt. – Gerneio

+0

Sie haben Recht. Die Browser-Konsole hat diesen Fehler: userCodeAppPanel: 13 Uncaught TypeError: Kann die Eigenschaft 'options' von null nicht lesen – Mattestion

Verwandte Themen