存储FlexTable中的行

时间:2013-08-05 11:35:26

标签: google-apps-script

我有一个FlexTable,其中包含第一列的所有单元格中的复选框和其他单元格中的其他数据。我需要在checkBox为 true 时存储FlexTable的行,然后将其放在带有DocumentApp.create('Doc').getBody().appendTable(storedRows)的文档中,我不知道如何实现此功能。 使用FlexTable时可能不可能吗? 无论如何,提前谢谢你。

1 个答案:

答案 0 :(得分: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
}