2013-04-17 8 views
0

현재 여러 시트 (몇 가지 탭으로도 알려져 있음)에서 수년 동안의 수치 데이터를 사용하는 스프레드 시트로 작업하고 있으며, 1 년 가치. 몇 가지 온라인 자습서를 따르면 나는 주어진 해 동안 간단한 차트 대시 보드를 만들었습니다. 이것은 Serge의 대답 (set "ss"를 전역으로 만들고 setActiveSheet 사용)을 읽은 후 2 개 수정하여 지금까지 가지고있는 코드 조각입니다 (차트를 그릴 부분 제외).스프레드 시트에서 다른 시트를 선택하려면 Google Apps Script listbox를 사용하십시오.

var ss = SpreadsheetApp.openById(ssID); 
ss.setActiveSheet(ss.getSheetByName("2012")); 

function doGet() { 

    var sheet = ss.getActiveSheet(); 
    var data = sheet.getRange(1,1,sheet.getMaxRows(),sheet.getMaxColumns());  

    var dashboard = Charts.newDashboardPanel() 
    .setDataTable(data) 
    .build(); 

    var uiApp = UiApp.createApplication().setTitle("My Dashboard"); 

    // Dropdown box 

    var listBox = uiApp.createListBox() // Choose data by year 
    .setId('listBox') 
    .setName('listBox') 
    .setVisibleItemCount(1); 

    for (i=0; i<ss.getNumSheets(); i++) { 
    listBox.addItem(ss.getSheets()[i].getSheetName()); 
    } 

    var infoLabel = uiApp.createLabel('Select from List').setId('info').setVisible(false); 

    // Add a handler to the ListBox when its value is changed 

    var handler = uiApp.createServerChangeHandler('showSelectedinfo'); 
    handler.addCallbackElement(listBox); 
    listBox.addChangeHandler(handler); 

    // UI Element: Grid 

    var mygrid = uiApp.createGrid(1, 3); 
    mygrid.setWidget(0, 0, uiApp.createLabel('By Year:')); 
    mygrid.setWidget(0, 1, listBox); 
    mygrid.setWidget(0, 2, infoLabel) 

    var controlsPanel = uiApp.createVerticalPanel().add(mygrid); 

    uiApp.add(controlsPanel).add(dashboard);  

    return uiApp; 
} 


function showSelectedinfo(e){ 
    var app = UiApp.getActiveApplication(); 
    var selectedItem = e.parameter.listBox; 
    var listBox = app.getElementById('listBox'); 
    app.getElementById('info').setText('You selected :'+selectedItem).setVisible(true) 
    .setStyleAttribute('color','#008000'); 

    ss.setActiveSheet(ss.getSheetByName(selectedItem)); 

    return app; 

} 

이제 드롭 다운 상자를 사용하여 다른 시트 (예 : 연도)를 선택하고 이에 따라 차트를 업데이트하고 싶습니다. 그러나 "연도"를 선택하여 올바르게 표시 할 수는 있지만 새 시트의 데이터를 사용하도록 변경할 수는 없습니다. 아마도 여기에 어떤 전문가가 조언을 해줄 수 있을까요?

답변

1

다음은이를 달성하는 방법의 예입니다. 맞춤법으로 결과를 보여주기 위해 레이블이있는 트릭을 사용하지만, 필요없는 경우 ListBox와 핸들러 만 유지하면됩니다. 답변에 대한

var ss = SpreadsheetApp.getActiveSpreadsheet() 


function listSelect() { 
    var app = UiApp.createApplication().setHeight('100').setWidth('200').setTitle('Select Sheet'); 
    var p = app.createVerticalPanel(); 
    var serverHandler = app.createServerHandler('handler').addCallbackElement(p) 
    var listBox = app.createListBox() .setId('listBox').setName('listBox').addChangeHandler(serverHandler); 
    var label = app.createLabel('Please select sheet from here').setId('label') 
             .addMouseOverHandler(app.createClientHandler() 
             .forEventSource().setVisible(false) 
             .forTargets(listBox).setVisible(true)); 
for(n=0;n<ss.getNumSheets();++n){ 

    listBox.addItem('You are selecting '+ss.getSheets()[n].getName(), ss.getSheets()[n].getName())  
          } 
    listBox.setVisible(false) 


    p.add(listBox).add(label); 
    app.add(p); 
    ss.show(app) 
    return app;      
} 

function handler(e){ 
    var app = UiApp.getActiveApplication(); 
    var listBox = app.getElementById('listBox'); 
    var label = app.getElementById('label'); 
    listBox.setVisible(false); 
    label.setVisible(true).setText('You have selected sheet '+e.parameter.listBox); 
    ss.setActiveSheet(ss.getSheetByName(e.parameter.listBox)); 
// app.close() 
    return app; 
} 

enter image description here

+0

감사합니다. 그러나 내가 결국 언급했듯이 차트는 여전히 올바르게 업데이트되지 않습니다. 아마도 내 코드의 관련 비트를 업로드했을 때 명백한 오류를 볼 수 있습니까? – Louis

+0

몇 가지 테스트를 수행하고 처리기 기능에서 대시 보드를 다시 만들었을 때 첫 번째 숨기기 작업을 수행 할 수있게되었지만 실제로 갈 수있는 올바른 방법인지 확신 할 수 없습니다 ... 더 나은 솔루션을 제안 해 주시기 바랍니다. 너를 위해서. –

+0

각 시트마다 다른 패널을 만들고 가시성을 변경한다는 것은 매우 효율적으로 들리지 않습니다. :-) 어쨌든 제안 주셔서 감사합니다! – Louis

관련 문제