2013-01-18 152 views
0

我正在編寫一個腳本,該腳本通過URL打開外部Google電子表格。腳本需要將單元格複製到FlexTable中,並顯示它們。apps-script:將電子表格單元格複製到表格,格式爲

問題是電子表格單元格具有自定義顯示格式,以將它們顯示爲已用時間(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.任何想法?

ANOTHER編輯

應用程序腳本似乎已完全搞砸這件事。此代碼:

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

正確顯示的當前時間的分和秒部,但也有示出,而不是2。這代碼小數:

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

不工作。當電子表格中的z以非零毫秒數顯示時,此構造函數始終將毫秒數設置爲0(getMilliseconds返回0)。 任何人都有解決辦法?我需要應用程序腳本來處理田徑事件時間,通常是秒到2位小數,可能幾分鐘。 我注意到這些對應於1899年12月30日的日期。這很奇怪 - 這個日期不應該有負值嗎?作爲特殊情況,formatDate的GWT源代碼處理負值,很難看到它在做什麼。

+0

你是如何得到毫秒級的自定義顯示格式的?你能分享一個示例表嗎?我很好奇;-) –

+0

該代碼發自http://productforums.google.com/d/msg/docs/Nmptr8VsPbw/NswPve0iSLoJ上的ahab。我只是在應用程序腳本和Google雲端硬盤上工作了幾天(甚至是晚上),還沒有完全分享共享表單......我明天就去試試吧! – EML

回答

0

這個區域有多個相關的和未定義的錯誤;例如,參見here。讓Google表單處理經過的時間是一個糟糕的主意。我最終的解決方案是使用「整數」來保存時間,並且在GAS中進行所有必要的格式化和處理(仔細地說,因爲它們實際上是不精確的浮點數)。這很容易,並且比與Date作鬥爭要好得多。唯一的麻煩是如果您需要從Excel導入日期。我必須修改Excel電子表格以將日期轉換爲ms,然後導入這些日期。

0

這裏是一個可能的解決方法,以顯示時間,你所希望的方式:

我使用的UI定義的時間價值,但在腳本它轉換爲日期對象testsheet(請不要修改)以驗證它如何與「真實」日期對象一起工作。

編輯:以下不同的答案,這個帖子並this other通過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 
} 
相關問題