0

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;
}

}

ご協力いただきありがとうございます。

4

2 に答える 2

1

これは Serge Insas による検索機能のソリューションです。ありがとうございます。リストボックスで、「+」を含むアイテムを追加すると、バグが発生します。言葉に置き換えました。それからそれは働いていました。

 function rechercheDechet(value,doc,sheet,column) {
      var sh = sheet;
      var ss = doc;
      var last = sh.getLastRow(); 
      var lastCol = sh.getLastColumn()
      var range = sh.getRange(2, 1, last-2, lastCol ).getValues(); // on prend toute la ligne de données
      for (var i = 0; i < range.length; i++) {
        if (range[i][0].toString().match(value) == value) { // on compare la 1ere colonne avec le nom
        Logger.log('trouvé '+value +'  i='+i)
          return range[i][10]; //et on prend la colonne prix (indice 0 dans le comptage dans une array >> 10 pour col 11) 
        }
      }
      return;
    }
于 2013-01-09T15:13:53.393 に答える
0

特定のウィジェットではなく、親ウィジェットをCallBackElementとして使用する方がはるかに簡単です...

あなたのコードでは、このようにグリッド1(質問をする場所)を使用します

  handlerList.addCallbackElement(grid1); //est ce bon? c est ici que ça coince

それ以外の

handlerList.addCallbackElement(wasteListBox); //est ce bon? c est ici que ça coince

WasteListBoxは、入力するリスト自体であるため(私は思う)...とにかく、原則として、callbackelementには、値を取得するウィジェットが含まれている必要があるため、階層の上位が最適です。なぜpanel1ではないので、確信が持てますか?

動作しないことについてのあなたのコメントについてreturn appは、それは正常であり、ドキュメントで明確に説明されています

EDIT1:コードで見つかったもう1つの問題:検索関数(rechercheDechet)valueが配列と呼ばれる変数を返し、それをtextBoxに割り当てることで使用しました...これは機能しないはずです...

説明:2次元配列を使用してスプレッドシートの範囲を読み取る場合getValues()、forループで配列の行を繰り返し、配列(1次元)と文字列値(常にまた失敗する...)。最後に、関数はスプレッドシートの行(実際にはその一部)に対応する配列を返します。単一の列のみを選択した場合でも、値は2Dのままであることに注意してください。これを取り除くにはrange[i][0]、たとえば、範囲内の最初のセルを取得するかrange[i].toString()、文字列にするだけです。

J'espèreavoirétéclair、十分に明確であることを望んでいます。私はあなたのコードのコピーを試しましたが、SSに表示するデータがありませんが、小さな変更で機能しているようです;-)

EDIT2:別の問題もあります。これはselectListHandler(z)、サーバーハンドラーで呼び出している関数に関係します。この場合、変数zはいわゆるevent、つまりUIが返すもののエンコードされたデータです。しかし、関数の最初のパラメーターにz「そのまま」を使用していますが、これは...かなり混乱しています...イベントパラメーターのドキュメントの例を参照するか、ロガーを使用してそのパラメーターを確認することをお勧めします。コンテンツ。この回答の範囲内ですべてを説明するのは難しいでしょうrechercheDechetrangeLogger.log(e.parameter)

于 2013-01-08T17:16:54.627 に答える