0

クエリに一致する条件を使用して、Google スプレッドシートの行からタスク データ (タスク管理システム用) を取得するアプリケーションを作成しています。次に、このデータを onClickHandler のあるチェックボックスの横にある flexTable と、時間データを入力するためのテキスト ボックスに送信します。以下は、これをどのように達成したかの最も簡単な例です。

\\establish handler for checkboxes that are generated in flexTable
var updateHandler = app.createServerClickHandler('updateTasksfunc');
updateHandler.addCallbackElement(taskTable);

\\search Google Spreadsheet for rows matching condition
for(var i=1; i< taskData.length; i++){
   if (taskData [i][1] !=employee){
     continue;      
   }

\\look up if task is already completed, and set checkbox value to true/false
var complete = taskData[i][8].toString();
if(complete==="true"){var checkbox=true;}else{var checkbox=false;}

\\populate flexTable with values from spreadsheet query
taskTable.setWidget(i,0,app.createTextBox().setName('hours'+i).setWidth('50').setId("hour"+i)).setWidget(i,1,app.createCheckBox().setValue(checkbox).setName('complete'+i).addClickHandler(updateHandler)).setWidget(i,2,app.createLabel(taskData[i][2]).setWidth('250')).setWidget(i,3,app.createLabel(taskData[i][3]).setWidth('250')).setWidget(i,4,app.createLabel(taskData[i][4])).setWidget(i,5,app.createLabel(taskData[i][5])).setWidget(i,6,app.createLabel(taskData[i][6])).setWidget(i,7,app.createLabel(taskData[i][7])).setWidget(i,8,app.createTextBox().setVisible(false).setName("dataRow"+i).setValue(i))
}

\doGet() を編集

var numberOfItems = app.createTextBox().setName('rows').setValue(i).setVisible(false);
var rows1 = i+1;
taskTable.setWidget(rows1,0,numberOfItems)

Google スプレッドシートを更新するために clickHandler 関数で使用する予定のフレックス テーブルの列 8 にある非表示のテキスト ボックスに、スプレッドシートのデータ行を保存しました。

チェックボックスがクリックされたときに実行されるクリック ハンドラーを正常にアクティブ化しました。ただし、スプレッドシートの更新に使用できる flexTable からデータを取得する方法をまだ見つけていません。

//以下の機能コード

function updateTasksfunc(e){
  var app = UiApp.getActiveApplication();

  var taskSS = SpreadsheetApp.openById('SPREADSHEETID');
  var taskSH = taskSS.getSheets()[0];
  var taskData = taskSS.getDataRange().getValues();

  var results = [];// an array to collect results
  var numberOfItems = e.parameter.rows; 
  app.add(app.createLabel(numberOfItems));
  for(var n=0;n<numberOfItems;n++){
    results.push([e.parameter['check'+n]]);// each element is an array of 2 values
  }
  for(var i=1;i<results.length;i++){
    var check = results[i][0];
    var row = i+1;
    taskSH.getRange(row,9,1,1).setValue(check);
  }
return app;  
} 

一般的なエラーが発生しています: 一般的な関数 getRowCount() が見つかりません。

これは、flexTable を適切に呼び出していないことを意味していると思います。

何かご意見は??

4

1 に答える 1