0

最初の列のすべてのセルにチェックボックスが含まれ、他のセルに他のデータが含まれる FlexTable があります。checkBox がtrueのときに FlexTable の行を保存して、後で .xmlを使用してドキュメントに配置する必要がありますがDocumentApp.create('Doc').getBody().appendTable(storedRows)、この機能を実現する方法がわかりません。FlexTable を使用している場合は、おそらく不可能でしょうか? とにかくよろしくお願いします。

4

1 に答える 1

0

checkBox の値を読み取る必要がある場合は、この checkBox に一意の名前を付ける必要があるため、 を使用して取得できますe.parameter.widgetName。ループを構築するときに通常行うことは、行番号を含む名前を生成して、データと直接関係を持たせることです。

この変更と他のいくつかの変更を加えてコードを書き直しました.... 詳細が必要な場合は、ご覧ください。

// Global variables
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getActiveSheet(); 
var data = sh.getDataRange().getValues();
var app = UiApp.getActiveApplication();

// Menu additions
function onOpen() {
  var menuEntries = [{name: 'Поиск вакансий', functionName: 'ui'}];
  ss.addMenu('Отчеты',menuEntries);
}

// UI
function ui() {  
  var app = UiApp.createApplication().setHeight(400).setWidth(800).setTitle('Поиск вакансий');
  var panel = app.add(app.createHorizontalPanel());
  var input = panel.createTextBox().setName('input').setId('input').setFocus(true);
  var button = panel.createButton('Сформировать документ');
  panel.add(input).add(button);

  var handler = app.createServerHandler('search');
  input.addChangeHandler(handler);
  handler.addCallbackElement(input);

  var click = app.createServerHandler('click');
  button.addClickHandler(click);
  click.addCallbackElement(button);// this is useless, the button has no data to transmit ?

  var table = app.createFlexTable().setId('table').setWidth(785).setBorderWidth(1).setCellPadding(1)
  var tpanel = app.createScrollPanel(table).setPixelSize(800, 383).setAlwaysShowScrollBars(true);
  table
    .setWidget(0,0,app.createCheckBox().setValue(true).setEnabled(false))
    .setWidget(0,1,app.createLabel('Вакансия'))
    .setWidget(0,2,app.createLabel('График'))
    .setWidget(0,3,app.createLabel('Время'))
    .setWidget(0,4,app.createLabel('Условия'))
    .setWidget(0,5,app.createLabel('Зарплата'))
    .setWidget(0,6,app.createLabel('Оплата'))
    .setWidget(0,7,app.createLabel('Организация'))
    .setWidget(0,8,app.createLabel('Телефон'));
  app.add(tpanel);
  ss.show(app);
}

// Search
function search(e) {
  var table = app.getElementById('table');

  var query = e.parameter.input.toLowerCase();

  var hidden = app.createHidden().setId('hidden').setName('hidden');
  app.add(hidden);// set a name too but I don't use it right now

  var check = app.createServerHandler('check');
  check.addCallbackElement(table);

  var r = 1;
  for (var row = 0; row < data.length; row++) {
      if(data[row].toString().toLowerCase().match(query) == query && query!= ''){ // you don't need to check each cell, you can use match on the stringified row instead.
        table.setWidget(r,0,app.createCheckBox().addValueChangeHandler(check).setName('check'+row));// create the checkBow once every row if condition is true and give it a name
        for (var c = 1; c < data[row].length; ++c) {
          table.setText(r,c,data[row][c].toString());
        }
        ++r
        continue;
      }
  }
  return app;
}

// Storing checked rows
function check(e) {
 var checkedArray = [];
  for(var n=0; n < data.length;++n){
    Logger.log('check'+n+' = '+e.parameter['check'+n]);// shows also 'undefined' for items not found by input query, that's normal
    if(e.parameter['check'+n]=='true'){
      checkedArray.push(data[n]);
    }
  }
  Logger.log('checkedArray = '+checkedArray);// see results
}

function click(e) {
  // no action right now
}
于 2013-08-05T15:23:54.763 に答える