0

URL を介して外部の Google スプレッドシートを開くスクリプトを作成しています。スクリプトは、セルを FlexTable にコピーして表示する必要があります。

問題は、スプレッドシートのセルが経過時間 (m:ss.SS) として表示するカスタム表示形式を持っていることです。table 要素を でロードするとtable.setWidget(x, y, app.createLabel(z))、ラベルには 1899 年の日付が表示されます。フォーマットをコピーする方法はありますか?

ありがとう。

編集

これはほぼそれを行います:

date = new Date(z);  // 'z' from 'getValues'
elapsed = Utilities.formatDate(date, "GMT", "m:ss.SS");
table.setWidget(x, y, app.createLabel(elapsed));

残念ながら、うまくいき"m:ss.SS"ません。ミリ秒は常に 0 として表示されます。

別の編集

apps-script はこれを完全に台無しにしてしまったようです。このコード:

date = new Date();
elapsed = Utilities.formatDate(date, "GMT", "m:ss.SS");
table.setWidget(x, y, app.createLabel(elapsed));

現在の時刻の分と秒の部分が正しく表示されますが、小数点以下 2 桁ではなく3桁が表示されます。このコードは次のとおりです。

date = new Date(z);  // 'z' from 'getValues'

うまくいきません。0 以外のミリ秒数でスプレッドシートに表示される場合z、このコンストラクターは常にミリ秒数を 0 に設定します ( getMilliseconds0 を返します)。誰でも回避策がありますか?陸上競技のイベント時間を処理するには、apps-script が必要です。これは通常、秒単位から小数点以下 2 桁までで、場合によっては数分です。これらが 1899 年 12 月 30 日の日付に対応していることに気付きました。これは奇妙です。この日付は負の時間値を持つべきではありませんか? の GWT ソース コードはformatDate、負の値を特殊なケースとして処理するため、それが何をしているのかを理解するのは困難です。

4

2 に答える 2

0

この領域には、関連する未修正のバグが複数あります。たとえば、ここを参照してください。Google スプレッドシートに経過時間を処理させるのは、悪い、悪い、考えです。私の最終的な解決策は、「整数」を使用して時間を保持し、GASで必要なすべてのフォーマットと処理を行うことでした(もちろん、実際には不正確な浮動小数点であるため、注意してください)。これはかなり簡単で、 と戦うよりもはるかに優れていDateます。唯一の複雑な点は、Excel から日付をインポートする必要がある場合です。Excel スプレッドシートを変更して日付をミリ秒に変換し、代わりにそれらをインポートする必要がありました。

于 2013-01-22T11:25:40.327 に答える
0

希望どおりに時間を表示するための可能な回避策は次のとおりです。テストシート (変更しないでください)

Ui を使用して時間値を定義しましたが、スクリプト内でそれを日付オブジェクトに変換して、「実際の」日付オブジェクトでどのように機能するかを確認しました。

編集:この投稿とAdamLによる他の投稿へのさまざまな回答に続いて、UIとカスタムフォーマットの助けを借りて、数百秒で短時間の値を表示および計算できるものを最終的に取得しました。

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menuEntries = [ {name: "Change cell format", functionName: "EditFormat"},
                      {name: "Reset format to default", functionName: "ResetFormat"},
                      {name: "show UI test", functionName: "sportChrono"},
                    ]               
  ss.addMenu("Custom Format", menuEntries);
}

function EditFormat() {
  var oldname = SpreadsheetApp.getActiveRange().getNumberFormat();
  var name = Browser.inputBox("Current format (blank = no change):\r\n"+ oldname);
  SpreadsheetApp.getActiveRange().setNumberFormat((name=="")?oldname:name);
}

function ResetFormat() {
  SpreadsheetApp.getActiveRange().setNumberFormat("0.###############");
}


 function sportChrono() {
  var app = UiApp.createApplication().setTitle('Show Time in mm:ss.SS');
  var main = app.createGrid(3, 4).setWidth('100');
  var button = app.createButton('validate')
  var btn2 = app.createButton('send to Cell').setId('btn2').setVisible(false)
  var time = app.createTextBox().setId('time').setName('time')
  var cellist = app.createListBox().addItem('A1').addItem('A2').addItem('A3').addItem('A4').addItem('A5').setVisible(false).setId('cellist').setName('cellist')
  var min = app.createTextBox().setName('min');
  var sec = app.createTextBox().setName('sec');
  var Msec = app.createTextBox().setName('Msec');
    main.setText(0,0,'minutes').setText(0,1,'secs').setText(0,2,'millisecs')
    main.setWidget(1,0,min).setWidget(1,1,sec).setWidget(1,2,Msec);
    main.setWidget(1,3,button).setWidget(2,0,time).setWidget(2,1,cellist).setWidget(2,2,btn2)
  var handler = app.createServerHandler('show').addCallbackElement(main)
    button.addClickHandler(handler)
  var handler2 = app.createServerHandler('writeToSheet').addCallbackElement(main)
    btn2.addClickHandler(handler2)
  app.add(main)
  ss=SpreadsheetApp.getActive()
  ss.show(app)
}

function show(e){
  var ss=SpreadsheetApp.getActive();
  var app = UiApp.getActiveApplication();
  var min = e.parameter.min
  var sec = e.parameter.sec
  var Msec = e.parameter.Msec
  var time = new Date()
      time.setHours(0,min,sec,Msec)
  var nmin = digit(time.getMinutes())
  var nsec = digit(time.getSeconds())
  var nMsec = digit(time.getMilliseconds())
  app.getElementById('time').setText(nmin+':'+nsec+'.'+nMsec)
  var btn2 = app.getElementById('btn2').setVisible(true)
  var cellist = app.getElementById('cellist').setVisible(true)
  return app
  }

function writeToSheet(e){
  var range = e.parameter.cellist
  var val = e.parameter.time
  var ss=SpreadsheetApp.getActive();
    ss.getRange(range).setFormula('=value("0:'+val+'")');
  }

function digit(val){
  var str
    if(val<10){
      str='0'+val}
    else if(val>9&&val<99){
      str=val.toString()}
    else{
      str=Math.round(val/10).toString()
    }
  return str
}
于 2013-01-18T18:58:23.083 に答える