0

コールバックを介して配列を送信しようとしていますが、運がありません。私の意図を説明させてください.専門家がこのジマを解決する方法についていくつかのアイデアを送ってくれるかもしれません.

データを収集するスプレッドシートを作成しました。次に、ユーザーがチェックボックスをクリックして処理できるように、行データをフレックス テーブルにプルする UI スクリプトを作成します。ユーザーがチェックするか空白のままにするチェックボックスを含む別のフレックステーブルを作成しました。私のスクリプトでは、チェックボックスの条件を含む配列を送信する必要があります。なんで?データの正しい更新ステータスを送信するために、スプレッドシートにプッシュできる行番号または配列の配置も必要だからです。

スクリプトは、アクションが必要なデータのみを UI に取り込みます。したがって、私はスプレッドシートの行 1、3、4、5、および 8 を操作している可能性がありますが、UI フレキシブル テーブルでは、データに対応する行は行 1、2、3、4、5 であるため、行の割り当ては行われません。マッチ。しかし、配列を使用すると、取得された行が 1、3、4、5、および 8 であることをキャプチャして、それに応じてスプレッドシートを更新できます。

ただし、offset[inc] というラベルの付いた配列をコールバックしようとすると問題が発生します。それを機能させることができません。メソッド addcallback が見つからないという実行エラーが発生し、機能させることができません。

addcallback メソッドまたは代替の推奨事項を介して配列を送信する方法に関する推奨事項をいただければ幸いです。

ありがとう、

ショーン・ナッツマン

function doGet(e){
  var app = UiApp.createApplication();

  //Create Caption Panel
  var captionPanel = app.createCaptionPanel('Detention   Attendance').setWidth('350px').setHeight('75px').setStyleAttribute('fontWeight', 'bold').setStyleAttribute('fontSize', '24px');

  //Add a widget to caption panel
  captionPanel.add(app.createLabel("Please enter attendance for Detention by clicking the     checkbox next to the student's name if they were present. Then click Sumbit."));

  //add the caption panel to the application  
  app.add(captionPanel);

  var panel = app.createHorizontalPanel();
  var flexTable = app.createFlexTable().setStyleAttribute('border', '2px solid black')
      .setStyleAttribute('borderCollapse','collapse')
      .setBorderWidth(2)
      .setCellSpacing(50)
      .setCellPadding(6); 

  //Get Data from spreadsheet
  var spreadsheetId = '0Aup0nXQ4K-pydFREb1FFcTFYX3lOenNQenR1Q01jQ1E';   //Change this to     the Spreadsheet ID
  var dataArray = getData(spreadsheetId);
  var inc = 1;
 //Load data into table cells
   for (var row = 0; row<dataArray.length; row++) {
      var booleanCheck =  dataArray[row] [17];
      var offset = new Array();


      if (booleanCheck == "" || booleanCheck == "Date Served") {
         if (row > 0) {
         Logger.log("Row value = " + row);      
         var ticketDate = dataArray[row] [0];
         var dateStamp = Utilities.formatDate(new Date(ticketDate), "America/Chicago", "MM/dd/yyyy");

         dataArray[row] [0] = dateStamp;
         var ticketDate2 = dataArray[row] [16];
         var dateStamp2 = Utilities.formatDate(new Date(ticketDate2), "America/Chicago", "MM/dd/yyyy");
         dataArray[row] [16] = dateStamp2;
         flexTable.setText(row, 1, dataArray[row][2].toString());
         flexTable.setText(row, 0, dataArray[row][0].toString());
         flexTable.setText(row, 2, dataArray[row][16].toString());  
         offset[inc] = row; inc++;
         Logger.log('Inc variable = ' + inc);
         Logger.log('Offset = ' + offset[inc-1]);
     } else {
         Logger.log("Inside ELSE row is not > 0");
         Logger.log("Row value here = " + row);
         flexTable.setText(0, 1, "Student's Name").setStyleAttribute(0, 1, 'fontWeight', 'bold');
         flexTable.setText(0, 0, "Date Assigned").setStyleAttribute(0, 0, 'fontWeight', 'bold');
         flexTable.setText(0, 2, "Date Delinquent").setStyleAttribute(0, 2, 'fontWeight', 'bold');    
       }  
     }
   }
  Logger.log(offset);
  panel.add(flexTable);

  var check1 = app.createCheckBox().setName('ch1');  
  var check2 = app.createCheckBox().setName('ch2');
  var check3 = app.createCheckBox().setName('ch3');
  var check4 = app.createCheckBox().setName('ch4');
  var check5 = app.createCheckBox().setName('ch5');
  var check6 = app.createCheckBox().setName('ch6');
  var check7 = app.createCheckBox().setName('ch7');
  var check8 = app.createCheckBox().setName('ch8');
  var check9 = app.createCheckBox().setName('ch9');
  var submitButton = app.createButton("Submit");
  var handler = app.createServerClickHandler('updateStatus');
  handler.addCallbackElement(check1)
    .addCallbackElement(check2)
    .addCallbackElement(check3)
    .addCallbackElement(check4)
    .addCallbackElement(check5)
    .addCallbackElement(check6)
    .addCallbackElement(check7)
    .addCallbackElement(check8)
    .addCallbackElement(check9)
    .addCallbackElement(offset);
  submitButton.addClickHandler(handler);
  handler.addCallbackElement(check1)
     .addCallbackElement(check2)
     .addCallbackElement(check3)
     .addCallbackElement(check4)
     .addCallbackElement(check5)
     .addCallbackElement(check6)
     .addCallbackElement(check7)
     .addCallbackElement(check8)
     .addCallbackElement(check9)
     .addCallbackElement(offset);

  var table = app.createGrid(11,1).setStyleAttribute('border', '2px solid black')
      .setStyleAttribute('borderCollapse','collapse')
      .setBorderWidth(2)
      .setWidth('75px')
      .setCellSpacing(5)
      .setCellPadding(6);
   table.setStyleAttributes({textAlign: "center"});
   table.setStyleAttribute('fontWeight', 'bold').setText(0, 0, 'Attendance');
   table.setWidget(1,0, (check1));
   table.setWidget(2,0, (check2));
   table.setWidget(3,0, (check3));
   table.setWidget(4,0, (check4));
   table.setWidget(5,0, (check5));
   table.setWidget(6,0, (check6));
   table.setWidget(7,0, (check7));
   table.setWidget(8,0, (check8));
   table.setWidget(9,0, (check9));
   table.setWidget(10,0,(submitButton));

   panel.add(table);
   app.add(panel);
   app.close();
   return app;
}
4

2 に答える 2

0

私が通常行うことは、配列を文字列に変換し、ウィジェットのタグに書き込むことです。e.parameter.widgetName_tag次に、ハンドラー関数で使用して取得できます。この時点で、それを分割して配列を取得できます。e.parameter.widgetName_tag.split(',');

データにはコンマが含まれている可能性があるため (これは配列のデフォルトの区切り記号です) 、 joinand文字を選択するときは注意が必要です... 私は | をよく使用します。splitまたは他の「珍しい」文字 (Ë,Í;∆) をjoin('∆')and と組み合わせて使用​​するとsplit('∆')、配列が元のように返されると確信しています。

もちろん、ウィジェットは に含める必要がありますcallBackElementが、これは最上位の親 UiApp 要素を として使用することで簡単に実現できますcallBackElement

最後のコメント : 生活を簡素化するウィジェット ID を使用してみてください。たとえば、使用する数値を簡単に取得できるように、配列インデックス (chk0、chk1、chk2...) に対応する番号を含む ID を使用してください。次のようなものを使用して、ハンドラー関数で:

Number(e.parameter.source.replace(/[a-z]/ig,''))

これにより、ハンドラー呼び出しの発信元を識別する番号が得られるため、次のcheckBoxように記述できます。

var arrayElement = e.parameter.widgetName_tag.split(',')[Number(e.parameter.source.replace(/[a-z]/ig,''))];
于 2013-06-03T05:59:18.040 に答える
0
var array = ['foo','poo'];
var arrayString = JSON.stringify(array);

その時点で、arrayString をコールバック要素にアタッチするだけで、出来上がりです! 次に、handlerFunction で e.parameter.arrayString を使用してアクセスし、解析して次のように配列に戻します。

var array = JSON.parse(e.parameter.arrayName);
//array = ['foo','poo']
于 2015-02-28T15:21:34.797 に答える