1

スプレッドシートデータからテーブルビューを作成しているuiAppがありますが、日付列のセルが空であることが問題です。

基本的に、一部のスプレッドシートセルはオプションであり、テーブルに値を入れない(またはnullにする)方法がわかりません。現在、列の値を次のように設定すると機能します。

projectDataRaw[i][projectDataKeys[j]]= new Date(); // inserting dummy data

ただし、テーブルビューでもこれらのセルを空白のままにしておきたいのですが、次を使用する場合は次のようになります。

projectDataRaw[i][projectDataKeys[j]]= null; // 

または、そのバリエーションとして、列タイプがDATEに設定されているためエラーが発生します。文字列に変換することはできましたが、日付の値が利用可能になったときにそれらを相互に比較できるようにしたかったのです。

-テーブルビューとnullデータの問題の例-

// load data from sheet
var _PMsheet = "sheet key";
var sSheet = SpreadsheetApp.openById(_PMsheet);
var projectData = sSheet.getRangeByName("ProjectDateCol").getValues();

var projectDataTable = Charts.newDataTable();
projectDataTable.addColumn(Charts.ColumnType.DATE, "Date Column");

for (var i=0; i < projectData.length; i++) {
  if (projectData[i] == undefined || projectData[i] == "undefined") {
    projectDataTable.addRow([null]);// Object type does not match column type.
    // null fails, "undefined" fails, "" fails, [] fails 
  }
  else {
    projectDataTable.addRow([projectData[i]]); // this cell has a valid date obj
  }

}
4

1 に答える 1

0

A1セルにnullを書き込み、A2セルに現在の日付を書き込む簡単なスクリプトを作成しました。完全な列Aは、日時であることが検証されます。スクリプトの実行後、セルA1は、前に値が含まれていて、警告またはエラーメッセージがない場合でも、空になります。

function myFunction() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var rangeValues = [[null], [new Date()]];
  sheet.getRange("A1:A2").setValues(rangeValues);
}

この例が役に立たない場合は、期待どおりに機能しない、可能な限り最小の動作スクリプトを公開してください。

著者の説明に基づいて更新:問題の原因を見つけて回避策を見つけようとする簡単なスクリプトを作成しました。コードは次のとおりです。行のコメントを解除するとdata.addRow(['', 2.0]);、メソッドによって例外がスローされaddRowます。これは予想される動作です。行のコメントを解除するdata.addRow([null, 3.0]);と、そのchart.setDataTable(data)行は例外をスローします。私の観点からすると、この動作は正しくありません。問題を問題追跡システムに報告する必要があると思います。

また、 DataTableBuilder.setValueメソッドを使用することにより、この問題の回避策があります。コードはそれを示しています。

ちなみに、DataTableBuilder.setValueドキュメントの説明は正しくありません。columnパラメータは含まれていません。これは、課題追跡システムのトピックです。

function doGet(e) {
  var app = UiApp.createApplication();
  var chart = Charts.newTableChart();
  var data = Charts.newDataTable();
  data.addColumn(Charts.ColumnType.DATE, 'Date');
  data.addColumn(Charts.ColumnType.NUMBER, 'Value');
  data.addRow([new Date(), 1.0]);
//  data.addRow(['', 2.0]); // throws the "Object type does not match column type" exception in this line.
//  data.addRow([null, 3.0]); // throws the "We're sorry, a server error occurred. Please wait a bit and try again" exception in the "chart.setDataTable(data)" line.
  data.setValue(1, 1, 3.0);
  chart.setDataTable(data);
  app.add(chart.build());
  return app;
}
于 2012-09-11T09:38:16.850 に答える