0

我正在编写一个通过 URL 打开外部 Google 电子表格的脚本。该脚本需要将单元格复制到 FlexTable 中,并显示它们。

问题是电子表格单元格具有自定义显示格式,以将它们显示为经过时间(m:ss.SS)。如果我只是用 加载表格元素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。有什么想法吗?

另一个编辑

应用程序脚本似乎完全搞砸了。这段代码:

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

正确显示当前时间的分钟和秒部分,但显示了3位小数,而不是 2 位。这段代码:

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

不工作。当z以非零毫秒数显示在电子表格中时,此构造函数始终将毫秒数设置为 0(getMilliseconds返回 0)。有人有解决方法吗?我需要应用程序脚本来处理田径比赛时间,通常是秒到小数点后 2 位,可能是几分钟。我注意到这些对应于 1899 年 12 月 30 日的日期。这很奇怪——这个日期不应该有一个负时间值吗?GWT 源代码将formatDate负值作为一种特殊情况处理,很难看出它在做什么。

4

2 回答 2

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 回答
0

该区域有多个相关且未修复的错误;例如,请参见此处。让 Google 表格处理经过的时间是一个糟糕的想法。我最终的解决方案是使用“整数”来保持时间,并在 GAS 中进行所有必需的格式化和处理(小心,因为它们实际上是不精确的浮点数,当然)。这很容易,而且比与Date. 唯一的麻烦是如果您需要从 Excel 导入日期。我不得不修改 Excel 电子表格以将日期转换为 ms,然后将其导入。

于 2013-01-22T11:25:40.327 回答