2017-05-16 2 views
0

Ich möchte ein Formular haben, mit dem der Benutzer einige Daten eingeben kann, die dann in Variablen zur Verwendung in anderen Funktionen gespeichert werden. Insbesondere brauche ich sie nur, um den Namen von zwei Blättern (shtName und databaseName) definieren zu können.Variable basierend auf Formulareingabe in Google Apps Script (Tabellenkalkulation) definieren

Ich kann die Variable nicht im Skript arbeiten, da es mir sagt, dass die Variablen nicht definiert sind (bezieht sich auf shtName & databaseName hier).

ich diesen Fehler: ReferenceError: "shtName" is not defined.

Wenn ich shtName und database außerhalb einer Funktion zu definieren, es funktioniert. Das ist natürlich das Problem, aber nicht sicher, wie ich es umgehen soll.

index.html

<html> 
<head> 
<base target="_top"> 
</head> 
<body> 
<form name="myForm"> 
Name of current sheet:<br> 
<input type="text" name="formshtname" > 
<br><br> 
Which database sheet to search in?<br> 
<input type="text" name="formtagdatabase"> 
<br><br> 
    <input type="button" value="Submit" 
    onclick="google.script.run 
     .withSuccessHandler(google.script.host.close) 
     .formSubmit(this.parentNode)" /> 
    <input type="button" value="Close" onclick="google.script.host.close()" /> 
</form> 
</body> 
</html> 

addTags.gs

function onOpen() { 
    var ui = SpreadsheetApp.getUi(); 
    ui.createMenu('Tags') 
    .addItem('Setup', 'openSetup') 
    .addSeparator() 
    .addItem('Add tags', 'findingTags3') 
    .addToUi(); 
} 

function openSetup() { 
    var html = HtmlService.createHtmlOutputFromFile('index').setSandboxMode(HtmlService.SandboxMode.IFRAME); 
    SpreadsheetApp.getUi() // Or DocumentApp or FormApp. 
    .showModalDialog(html, 'To auto complete tags, fill in the form'); 
} 


function formSubmit(form) { 
var shtName = form.formshtname; 
var databaseName = form.formtagdatabase; 
} 

function findingTags3() { 
// bunch of code 

/* current spreadsheet */ 
var spreadsheet = SpreadsheetApp.getActive() 
var sht = SpreadsheetApp.setActiveSheet(spreadsheet.getSheetByName(shtName)); // want this to be defined from form 

/* tag database spreadsheet */ 
var spreadsheet2 = SpreadsheetApp.openById("xxx"); 
var sht2 = spreadsheet2.getSheetByName(databaseName); // want this to be defined from form 

// more code 
} 

EDIT:

Ok, ein Weg, der durch Addieren dieser Innen Funktion findingtags3 es tut()

var shtName = Browser.inputBox("Current sheet name"); 
var databaseName = Browser.inputBox("Input sheet name of database you want to search"); 

Ich denke, das wird es tun, aber es wäre netter, ein richtiges Setup zu haben, wo Sie diese Informationen eingeben und es gespeichert wird, bis Sie die Eingabe ändern.

+1

Wenn Sie etwas speichern möchten, checkout [PropertiesService] (https://developers.google.com/apps-script/reference/properties/properties-service). Oder Sie können es auch in einer Datei speichern. – Cooper

Antwort

0

Sie können propertiesService verwenden, um Ihre Variable zu speichern, bis Sie bereit sind, die Funktion auszuführen.

Ihr Code wird wie folgt aussehen:

function exampleSubmit(){ // this function will set a mock/default values to properties 
    var form = { 
    "formshtname" : "Sheet1", 
    "formtagdatabase" : "Sheet4" 
    } 
    Logger.log(form) 
    formSubmit(form) 
} 

function formSubmit(form) { 
    var docProp = PropertiesService.getDocumentProperties() 
    docProp.setProperty("shtname", form.formshtname) 
    docProp.setProperty("databaseName",form.formtagdatabase) 
} 

function findingTags3() { 
// bunch of code 
    var docProp = PropertiesService.getDocumentProperties() 
    var shtName = docProp.getProperty("shtname") 
    var databaseName = docProp.getProperty("databaseName") 
/* current spreadsheet */ 
var spreadsheet = SpreadsheetApp.getActive() 
var sht = SpreadsheetApp.setActiveSheet(spreadsheet.getSheetByName(shtName)); // want this to be defined from form 
    Logger.log(sht.getName()) 

/* tag database spreadsheet */ 
var spreadsheet2 = SpreadsheetApp.openById("xxx"); 
var sht2 = spreadsheet2.getSheetByName(databaseName); // want this to be defined from form 
Logger.log(sht2.getName()) 
// more code 
} 

Dieses Dokument spezifische Eigenschaft ist, wenn Sie diese Werte wollen für jeden Benutzer eindeutig sein. Verwenden Sie stattdessen user properties.

Verwandte Themen