Gewusst wie: übergeben Sie parameter an html?
Ich habe ein Skript, das die Datei verwendet picker, aber ich übergeben zu müssen, einen bestimmten parameter, die aufgerufen wird, userId und gehalten wird wie eine Globale variable in der aufrufenden Skript. Als die Aufrufe sind asynchron, es scheint ich kann nicht auf diese parameter. Ist es Weg, um den Zugriff auf die parameter aus der html-Datei, oder übergeben Sie diesen parameter, um die html?
Ich könnte mischen und vorgefertigte html-und nicht Vorlagen (d.h. https://developers.google.com/apps-script/guides/html/templates und https://developers.google.com/apps-script/guides/html/) aber ich brauche, um dieses Problem zu lösen.
Jede Hilfe dankbar.
Hier ist der aufrufende code (eingeleitet durch ein Menü-Element in einer Tabellenkalkulation):
function syncStudentsFile(userId, ss) {
scriptUser_(userId); //save userId
Logger.log('SRSConnect : syncStudentsFile : userId:'+userId); //userId is correct here
var ss = SpreadsheetApp.getActiveSpreadsheet();
var html = HtmlService.createHtmlOutputFromFile('PickerSync.html')
.setWidth(600).setHeight(425);
SpreadsheetApp.getUi().showModalDialog(html, 'Select a file');
}
function scriptUser_(userId) {
if (userId !== undefined)
sUserId = userId; //Global variable
try { return sUserId; } catch (e) { return undefined; }
}
function getOAuthToken() { //used by Picker
DriveApp.getRootFolder();
return ScriptApp.getOAuthToken();
}
Hier ist der html-picker-Datei:
<link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons.css">
<script type="text/javascript">
var DEVELOPER_KEY = '..............';
var DIALOG_DIMENSIONS = {width: 600, height: 425};
var pickerApiLoaded = false;
/**
* Loads the Google Picker API.
*/
gapi.load('picker', {'callback': function() {
pickerApiLoaded = true;
}});
/**
* Gets the user's access token from the server-side script so that
* it can be passed to Picker. This technique keeps Picker from needing to
* show its own authorization dialog, but is only possible if the OAuth scope
* that Picker needs is available in Apps Script. Otherwise, your Picker code
* will need to declare its own OAuth scopes.
*/
function getOAuthToken() {
google.script.run.withSuccessHandler(createPicker)
.withFailureHandler(showError).getOAuthToken();
}
/**
* Creates a Picker that can access the user's spreadsheets. This function
* uses advanced options to hide the Picker's left navigation panel and
* default title bar.
*
* @param {string} token An OAuth 2.0 access token that lets Picker access the
* file type specified in the addView call.
*/
function createPicker(token) {
if (pickerApiLoaded && token) {
var uploadView = new google.picker.DocsUploadView();
var picker = new google.picker.PickerBuilder()
//Instruct Picker to display only spreadsheets in Drive. For other
//views, see https://developers.google.com/picker/docs/#otherviews
.addView(google.picker.ViewId.DOCS)
.addView(google.picker.ViewId.RECENTLY_PICKED)
.addView(uploadView)
.hideTitleBar()
.setOAuthToken(token)
.setDeveloperKey(DEVELOPER_KEY)
.setCallback(pickerCallback)
//Instruct Picker to fill the dialog, minus 2 pixels for the border.
.setSize(DIALOG_DIMENSIONS.width - 2,
DIALOG_DIMENSIONS.height - 2)
.build();
picker.setVisible(true);
} else {
showError('Unable to load the file picker.');
}
}
/**
* A callback function that extracts the chosen document's metadata from the
* response object. For details on the response object, see
* https://developers.google.com/picker/docs/result
*
* @param {object} data The response object.
*/
function pickerCallback(data) {
var action = data[google.picker.Response.ACTION];
if (action == google.picker.Action.PICKED) {
var doc = data[google.picker.Response.DOCUMENTS][0];
var id = doc[google.picker.Document.ID];
google.script.host.close();
//--------------> user global parameter sUserId set earlier
google.script.run.PickerSyncFile(sUserId, id);
} else if (action == google.picker.Action.CANCEL) {
google.script.host.close();
}
}
/**
* Displays an error message within the #result element.
*
* @param {string} message The error message to display.
*/
function showError(message) {
document.getElementById('result').innerHTML = 'Error: ' + message;
}
</script>
<div>
<script>getOAuthToken()</script>
<p id='result'></p>
<input type="button" value="Close" onclick="google.script.host.close()" />
</div>
Hier ist die picker-code:
function pickerSyncFile(userId, id) {
Logger.log('userId:'+userId); //BUG: it is null
Logger.log('id:'+id); //id returned well from picker
//rest of code here but userId was is incorrect
}
InformationsquelleAutor theworldismyoyster | 2015-05-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der sicherste Weg ist die übergabe der benötigten Daten in den HTML-Code direkt. Wenn Sie die Eigenschaften oder die cache-Dienst kann es Komplex oder Versagen unter mehrere gleichzeitige Benutzer.
Es gibt viele Techniken, um eine Initiale Objekt aus dem server - (.gs) an den client (.html).
Mit HtmlTemplate, die Sie machen können:
//.gs-Datei
und in Ihrem template-client.html Datei:
Es ist auch möglich, es zu tun, ohne mit templating, indem ein verstecktes div zu einem HtmlOutput:
//.gs-Datei:
und in Ihrem output-client.html:
Beide Methoden werden verglichen und besser erklärt in diesem kleinen github habe ich gemacht:
https://github.com/zmandel/htmlService-get-set-data
InformationsquelleAutor Zig Mandel
Verwende ich oft HtmlService Vorlagen zu schieben statischen Werte an den client.
index.html
code.gs
Sie Frage ist, wie ein parameter übergeben werden, um html. Sie code zeigt, Sie verstehen google.script.laufen, so zeigte ich Ihnen die template-Methode. Bitte überarbeiten und zu klären, Ihre Frage.
Ich versuchte yo verbinden die 2 nichts scheint zu arbeiten, daher Suche für die übergabe der parameter. .bewerten Sie auf den html-Code (in syncStudentsFile) gehalten Fehler zurückgeben. Ich bin nicht so der Experte in Bezug auf, wie die Arbeit dieses html. Daher meine Frage.
InformationsquelleAutor Spencer Easton
In Ihrem code:
Weisen Sie einen Wert für die Globale variable mit dem Namen
sUserId
. Aber, dann, wenn Sie versuchen, um es abzurufen, nichts ist da. Globale Variablen verlieren Ihren Wert, sobald die aktuelle Instanz des Codes bringen Sie ausführen abgeschlossen ist. Globale variable nicht beständig Ihre Werte.Benötigen Sie die Eigenschaften Service um den Wert zu speichern. Oder Sie konnte die Cache-Dienst. Wenn Sie wollen der Wert der Benutzer-id, die verfallen nach einiger Zeit, verwenden Sie die cache-Dienst.
InformationsquelleAutor Alan Wells
Durch das Anhängen der HTML-Datei, wie unten gezeigt.
innerhalb von Code.gs
html-sample.html
Klicken Sie auf die " Versuchen Sie es Jetzt!' Schaltfläche und Sehen Sie die Magie!
InformationsquelleAutor Micklo_Nerd