Comment passer un paramètre au format html?
J'ai un script qui utilise le sélecteur de fichiers, mais j'ai besoin de passer un paramètre spécifique qui est appelé nom d'utilisateur et est conservé comme une variable globale dans le script d'appel. Que les appels sont asynchrones, il semble que je ne peut pas accéder à ce paramètre. Est-il loin pour accéder à ce paramètre dans le fichier html ou de passer ce paramètre à la page html?
J'ai peut-être un mélange basé sur un modèle html et non basé sur un modèle (c'est à dire https://developers.google.com/apps-script/guides/html/templates et https://developers.google.com/apps-script/guides/html/) mais j'ai besoin de résoudre ce problème.
Reconnaissant de toute aide.
Voici le code appelant (initié par l'intermédiaire d'un élément de menu dans une feuille de calcul):
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();
}
Voici le code html du sélecteur de fichier:
<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>
Voici le sélecteur de 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
}
Vous devez vous connecter pour publier un commentaire.
Le moyen le plus sûr est de passer les données nécessaires à l'HTML directement. Si vous utilisez des propriétés ou le cache de service, il peut être complexes ou échouer dans plusieurs utilisateurs simultanés.
Il existe de nombreuses techniques pour passer d'un objet initial à partir du serveur (.gs) pour le client (.html).
À l'aide de HtmlTemplate, vous pouvez le faire:
//.gs fichier
et dans votre template-client.html fichier:
Il est également possible de le faire sans l'aide de gabarits, en ajoutant un div caché pour un HtmlOutput:
//.gs fichier:
et dans votre output-client.html:
Les deux méthodes sont comparées et mieux expliqué dans ce petit github j'ai fait:
https://github.com/zmandel/htmlService-get-set-data
J'utilise souvent HtmlService modèles de poussée statique de valeurs pour le client.
index.html
code.gs
Dans votre code:
De l'affectation d'une valeur à la variable globale nommée
sUserId
. Mais, alors, quand vous essayez de le récupérer, il n'y a rien. Les variables globales perdent leur valeur dès que l'instance courante du code d'apporter de la course est terminée. Variable globale ne pas conserver leurs valeurs.Vous aurez besoin d'utiliser la Propriétés De Service pour stocker la valeur. Ou vous pourriez utiliser les Service de Cache. Si vous voulez la valeur de l'id de l'utilisateur expire après un certain temps, l'utilisation du cache de service.
En Ajoutant au Fichier HTML, comme indiqué ci-dessous.
dans le Code.gs
html-sample.html
Cliquez sur " Essayez-le Maintenant!' Bouton et de Voir la Magie!
Ce post fournit la solution comment passer des paramètres à un basé sur un modèle html:
Puis en page 2 l'utilisation de la balise pour imprimer la valeur de l'id;