web-dev-qa-db-ja.com

スプレッドシートから読み取った数値のフォーマット

GoogleAppsスプレッドシートのコンテンツの固定幅テキスト出力を作成するスクリプトを作成しています。 range.getValues()メソッドを使用して現在の範囲のすべての値を取得し、すべてを数回ループして、固定幅に貼り付けたときに適切にフォーマットされたテーブルのように見えるテキストのブロックを生成します-フォントメール。

私が抱えている唯一の問題は、数値の書式を複製できないことです。 range.getNumberFormats()を使用して数値フォーマット文字列を取得できますが、コード内でそのフォーマット文字列を適用する方法が見つかりません。 TEXT(値、フォーマット)スプレッドシート関数を使用してみましたが、どうやらGoogle Apps ScriptはJavaScriptコード自体からのスプレッドシート関数の呼び出しをまだサポートしていないようです(証明については この問題 を参照してください)。

12
jburgess

2015年12月 の時点で、厄介な回避策は破棄できます。 Googleは、セルからリテラル文字列表示値を取得するための2つの方法を提供しています。彼らはまだドキュメントを提供していないので、ここに要約があります:

Range.getDisplayValue()
範囲内の左上のセルの表示値を、SheetsUIに表示されるテキスト値を含む文字列として返します。空のセルは空の文字列を返します。

Range.getDisplayValues()
この範囲の表示値の長方形グリッドを返します。行ごと、次に列ごとにインデックスが付けられた、文字列の2次元配列を返します。空のセルは、配列内の空の文字列で表されます。範囲インデックスは1、1から始まりますが、JavaScript配列は[0] [0]からインデックス付けされることに注意してください。

例:

次のように、スプレッドシートに関心のある範囲があるとします。

screenshot

これらの4つのセルには、回避するのが最も難しい2つの形式が含まれています。日付/時刻と科学的記数法。しかし、新しい方法では、それには何もありません。

function demoDisplayValue() {
  var range = SpreadsheetApp.getActiveSheet().getRange("A1:B2");

  Logger.log( range.getDisplayValue() );
  Logger.log( range.getDisplayValues() );
}

ログ:

[16-01-14 13:04:15:864 EST] 1/14/2016 0:00:00
[16-01-14 13:04:15:865 EST] [[1/14/2016 0:00:00, 5.13123E+35], [$3.53, 1,123 lb]]
12
Mogsdad

ToFixed()と呼ばれる小数点以下の桁数を設定するJavaScriptメソッドを見つけました。

ドキュメントは次のとおりです。 http://www.w3schools.com/jsref/jsref_tofixed.asp

num.toFixed(x) //where x = the number of digits after the decimal point.

Google Appsスクリプトは、スプレッドシートから取得した金額を含むメッセージを返す必要がありました。小数点以下10桁でひどい感じでした。私の変数に適用されたこの方法は問題を解決しました。ラベルのテキスト部分に$を追加しました。

お役に立てれば!

10
Orion Palmer

事前に提供されている形式のリストは ここ です。一部の形式では、同等のJavaScriptは比較的簡単です。他の人にとって、それは非常に難しいです。そして、ユーザー定義のカスタムフォーマットを処理します-それで頑張ってください。

これは、htmlとして複製されたセルコンテンツを示すスクリーンショットです。現在のように修正されていませんが、スプレッドシートの形式を使用しています。

Screenshot

簡単にするGoogleApps Scriptヘルパー関数があります Utilities.formatString() および Utilities.formatDate()

_"h:mm:ss am/pm"_のような日付と時刻の場合、スプレッドシート形式はユーティリティに必要なものとほぼ同じです。一部の形式のam/pm指定を微調整するだけでよいことがわかりました。

_  var format = cell.getNumberFormat();
  var jsFormat = format.replace('am/pm','a');
  var jsDate = Utilities.formatDate(
          date,
          this.tzone,
          jsFormat);
_

ドルの場合、例: _"\"$\"#,##0.00"_:

_  var dollars = Utilities.formatString("$%.2f", num);
_

パーセント形式の数値の場合、例: _"0.00%"_:

_  var matches = format.match(/\.(0*?)%/);
  var fract = matches ? matches[1].length : 0;     // Fractional part
  var percent = Utilities.formatString("%.Xf%".replace('X',String(fract)), 100*num);
_

_"0.000E+00"_のような指数関数の場合は、組み込みのjavascript toExponential() を利用し、出力を微調整してスプレッドシートのように見せます。

_if (format.indexOf('E') !== -1) {
  var fract = format.match(/\.(0*?)E/)[1].length;  // Fractional part
  return num.toExponential(fract).replace('e','E');
}
_

保存されているスプレッドシート形式に対して文字列を比較するだけで、適切なコンバータを選択できます。

そして、私は非常に難しいとはどういう意味ですか? Sheetsが_# ?/?_と_# ??/??_に対して行うのとまったく同じ分子と分母の選択を思い付くフォーマッターを入手してみてください!スプレッドシートでは、フォーマットの問題です。スクリプトでは、それだけではありません...

6
Mogsdad

次のGoogleAppsスクリプトを試してください

function NumberFormat()
{var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getSheets()[0];

 var cell = sheet.getRange("A1:B10");
 // Always show 2 decimal points
 cell.setNumberFormat("0,00,000.00");
}
4
mpsbhat

実際、スプレッドシート関数を直接呼び出すことはできません。ただし、通常はsetNumberFormatsを使用してフォーマットを設定できます。ドキュメントを見てください ここ

0