UI を自動的に入力するコードを作成しました。リストボックスでアイテムを選択すると、入力するデータを探す関数が起動します。問題は階層にあると思います.リストボックスはグリッド1にあり、パネルのグリッド1です。コールバック要素の使用方法とその理由...使用する理由がよくわかりません。Googleのドキュメントは完全ではありません。データを追加するためのクリック ボタンは正常に動作していますが、changehandler 変数が「未定義」である理由がわかりません。これが私のコードです。
var submissioSSKey = 'XXXXXX';//Change this key to your spreadsheet key
//creation de l'interface d'ajout des déchets
function addWasteData() {
var app = UiApp.createApplication().setTitle('Ajout de déchet').setHeight(400).setWidth(500);
var ss = SpreadsheetApp.getActiveSpreadsheet();
var wasteListSheet = ss.getSheetByName("Registre déchets");
//1. creation d'une grille pour structurer la app:
var mypanel = app.createVerticalPanel().setId('mainPanel');
var grid1 = app.createGrid(2, 3).setId('grid1').setStyleAttribute("border","3px double #CCCCCC");
var grid2 = app.createGrid(3, 3).setStyleAttribute("border","1px solid #CCCCCC");
var grid3 = app.createGrid(3, 3).setStyleAttribute("border","1px solid #CCCCCC");
var grid4 = app.createGrid(3, 3).setStyleAttribute("border","1px solid #CCCCCC");
//2.Labels informatifs
grid1.setWidget(0, 0, app.createLabel('Déchet'))
.setWidget(0, 1, app.createLabel('Quantité'))
.setWidget(0, 2, app.createLabel('Unités'));
grid2.setWidget(0, 0, app.createLabel('Prix'))
.setWidget(0, 1, app.createLabel('€ / unit'))
.setWidget(1, 0, app.createLabel('Traitement'))
.setWidget(1, 1, app.createLabel('Transport'))
.setWidget(1, 2, app.createLabel('Location'));
grid3.setWidget(0, 0, app.createLabel('Dates'))
.setWidget(1, 0, app.createLabel('Enlèvement'))
.setWidget(1, 1, app.createLabel('Facture'))
.setWidget(2, 1, app.createLabel('Entrée donnée'));
grid4.setWidget(0, 0, app.createLabel('Codes'))
.setWidget(0, 1, app.createLabel('déchet'))
.setWidget(1, 0, app.createLabel('Regroupement'))
.setWidget(1, 1, app.createLabel('Valorisation'))
.setWidget(1, 2, app.createLabel('Élimination'));
// text box et listes
grid1
.setWidget(1, 0, app.createListBox().setName('waste').setId('waste'))
.setWidget(1, 1, app.createTextBox().setName('quantity').setId('quantity'))
.setWidget(1, 2, app.createListBox().setId('unitListBox').setName('unit').addItem("tonnes").addItem("m³"));
grid2.setWidget(2, 0, app.createTextBox().setName('Trait').setId('trait'))
.setWidget(2, 1, app.createTextBox().setName('Transport').setId('transport'))
.setWidget(2, 2, app.createTextBox().setName('Location').setId('location'));
grid3.setWidget(2, 0, app.createDateBox().setId('enlevement').setName('enlevement'))
.setWidget(2, 1, app.createDateBox().setId('facture').setName('facture'))
.setWidget(2, 2, app.createDateBox().setId('inputdb').setName('inputdb'));
grid4.setWidget(0, 2, app.createTextBox().setName('codedechet').setId('codedechet'))
.setWidget(2, 0, app.createTextBox().setName('regroupement').setId('regroupement'))
.setWidget(2, 1, app.createTextBox().setName('valorisation').setId('valorisation'))
.setWidget(2, 2, app.createTextBox().setName('elimination').setId('elimination'));
app.createTextBox().setName('info').setId('info');
//3.définir la variable des éléments de la app pour modification dans le script
var wasteListBox = app.getElementById("waste").setName('waste');
var unitListBox = app.getElementById("unitListBox");
var info = app.getElementById("info");
var mybutton = app.createButton('Ajouter');
//4. creation de serveur d'évènement
// liste deroulante déchet
var handlerList = app.createServerChangeHandler('selectListHandler');
handlerList.addCallbackElement(wasteListBox); //est ce bon? c est ici que ça coince
wasteListBox.addChangeHandler(handlerList);
// envoi des données
var handler = app.createServerClickHandler('insertDataWaste');
handler.addCallbackElement(mypanel) //ici ça fonctionne
mybutton.addClickHandler(handler);
//Ajout de les données déchets au menu déroulant, texte box, etc:
//Ajout des données dans la listbox
numItemList1 = wasteListSheet.getLastRow()-1;//-1 pour exclure la dernière ligne qui est vide
//get the item array
list1ItemArray = wasteListSheet.getRange(2,1,numItemList1,1).getValues();
//Add the items in ListBox
for(var i=0; i<list1ItemArray.length; i++){
wasteListBox.addItem(list1ItemArray[i][0])
}
//creation de l'interface et affichage
mypanel.add(grid1)
.add(grid2)
.add(grid3)
.add(grid4)
.add(mybutton);
app.add(mypanel);
//return app; <-- ne fonctionne pas :/
SpreadsheetApp.getActiveSpreadsheet().show(app);
}
//test du fonctionnement du choix dans la liste en faisant apparaitre le le choix dans le text box traitement
function selectListHandler(z) {
var app = UiApp.getActiveApplication();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var wasteListBox = z
var wasteListSheet = ss.getSheetByName("Registre déchets");
var traitBox = app.getElementById('trait')
var transport = app.getElementById('transport');
var location = app.getElementById('location');
traitBox.setValue(rechercheDechet( wasteListBox,ss,wasteListSheet,11));
return app;
}
//Insertion des donénes lors du clic sur le boutton de soumission
function insertDataWaste(o){
var app = UiApp.getActiveApplication();
var intitule = o.parameter.waste;
var qty = o.parameter.quantity;
var codeDechet = o.parameter.codedechet;
var unit = o.parameter.unit;
var trait = o.parameter.Traitement;
var trans = o.parameter.Transport;
var loc = o.parameter.Location;
var fac = o.parameter.facture;
var enlev = o.parameter.enlevement;
var input = o.parameter.inputdb;
var regr = o.parameter.regroupement;
var valo = o.parameter.valorisation;
var elim = o.parameter.elimination;
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Data"); //.getActiveSheet() supprimé
var lastRow = sheet.getLastRow();
var targetRange = sheet.getRange(lastRow+1, 1, 1, 13).setValues([[intitule,codeDechet,qty,unit,trait,trans,loc,fac,enlev,input,regr,valo,elim]]);
return app;
}
そして見る機能:
function rechercheDechet(value,doc,sheet,column) {
var sh = sheet;
var ss = doc;
var last = sh.getLastRow();
var range = sh.getRange(2, 1, last-1, column).getValues();
{
for (var i = 0; i < range.length; i++) {
if (range[i] == value) {
return value;
}
}
return;
}
}
ご協力いただきありがとうございます。