我的谷歌应用程序脚本没有运行,没有与serverhandler的参数

时间:2014-09-26 10:48:11

标签: google-apps-script parameter-passing

我尝试使用脚本更改工作表,但它无法按预期工作。我可以加载右侧面板,但是当我尝试记录更改时没有任何反应。似乎没有调用“masterFunctionPS”。 功能periodSelection发布面板,列表框和按钮。但是,当我在按钮上咒骂时,没有任何补充。表中没有任何变化。

function periodSelection() { 

  var activeSS = SpreadsheetApp.getActiveSpreadsheet(); 
  var sheetPS = activeSS.getSheetByName("Periods"); 

  var uiPS = UiApp.createApplication().setWidth(300); 

  var panelPS = uiPS.createVerticalPanel(); 

  var periodPS = uiPS.createListBox(); 
  for (var i = 2; i < 13; i++) { 
    var range = "A" + i; 
    periodPS.addItem(sheetPS.getRange(range).getValue()); 
  } 

  var endDatePS = uiPS.createDatePicker(); 

  var recordPS = uiPS.createButton("Enregistrer"); 

  var masterPS = uiPS.createServerHandler('masterFunctionPS'); 
  masterPS.addCallbackElement(periodPS) 
          .addCallbackElement(endDatePS) 
  recordPS.addClickHandler(masterPS); 

  panelPS.add(periodPS); 
  panelPS.add(endDatePS); 
  panelPS.add(recordPS); 

  uiPS.add(panelPS); 

  SpreadsheetApp.getUi().showSidebar(uiPS); 

  return uiPS; 
} 

function masterFunctionPS(element) { 

  var parameterPS = element.parameter; 
  var appE = UiApp.getActiveApplication(); 

  var periodE = parameterPS.periodPS; 
  var endDateE = parameterPS.endDatePS; 
  var activeE = parameterPS.activeSS; 
  var sheetE = parameterPS.sheetPS; 

  switch (periodE)  { 
        case "P1": 
            sheetE.getRange("C2").setValue(endDateE); 
            break; 
        case "P2": 
            sheetE.getRange("C3").setValue(endDateE); 
            break; 
        case "P3": 
            sheetE.getRange("C4").setValue(endDateE); 
            break; 
        case "P4": 
            sheetE.getRange("C5").setValue(endDateE); 
            break; 
        case "P5": 
            sheetE.getRange("C6").setValue(endDateE); 
            break; 
        case "P6": 
            sheetE.getRange("C7").setValue(endDateE); 
            break; 
        case "P7": 
            sheetE.getRange("C8").setValue(endDateE); 
            break; 
        case "P8": 
            sheetE.getRange("C9").setValue(endDateE); 
            break; 
        case "P9": 
            sheetE.getRange("C10").setValue(endDateE); 
            break; 
        case "10": 
            sheetE.getRange("C11").setValue(endDateE); 
            break; 
        case "P11": 
            sheetE.getRange("C12").setValue(endDateE); 
            break; 
    } 
        return (appE); 
  }

1 个答案:

答案 0 :(得分:0)

您的代码中存在一些错误...主要是您忘记为您的小部件命名,并且名称用于从回调元素中检索值 下面是一个“纠正”的版本,但有两个项目无法正常工作,因为你试图在Ui中获取工作表的属性,而且不能像这样做......

请解释你需要什么,我可以建议一个更好的方法。

(参见代码中的注释并查看记录器以查看事件参数中的值)

function periodSelection() { 

  var activeSS = SpreadsheetApp.getActiveSpreadsheet(); 
  var sheetPS = activeSS.getActiveSheet(); 

  var uiPS = UiApp.createApplication(); 

  var panelPS = uiPS.createVerticalPanel(); 

  var periodPS = uiPS.createListBox().setName('periodPS'); 
  for (var i = 2; i < 13; i++) { 
    var range = "A" + i; 
    periodPS.addItem(sheetPS.getRange(range).getValue()); 
  } 

  var endDatePS = uiPS.createDatePicker().setName('endDatePS'); 

  var recordPS = uiPS.createButton("Enregistrer"); 

  var masterPS = uiPS.createServerHandler('masterFunctionPS'); 
  masterPS.addCallbackElement(panelPS);
  recordPS.addClickHandler(masterPS); 

  panelPS.add(periodPS); 
  panelPS.add(endDatePS); 
  panelPS.add(recordPS); 

  uiPS.add(panelPS); 

  SpreadsheetApp.getUi().showSidebar(uiPS); 
} 

function masterFunctionPS(element) { 
  var parameterPS = element.parameter; 
  var appE = UiApp.getActiveApplication(); 
  Logger.log('parameter : '+JSON.stringify(parameterPS));

  var periodE = parameterPS.periodPS; 
  var endDateE = parameterPS.endDatePS; 
  var activeE = parameterPS.activeSS; // won't work
  var sheetE = parameterPS.sheetPS; // won't work

  switch (periodE)  { 
        case "P1": 
            sheetE.getRange("C2").setValue(endDateE); 
            break; 
        case "P2": 
            sheetE.getRange("C3").setValue(endDateE); 
            break; 
        case "P3": 
            sheetE.getRange("C4").setValue(endDateE); 
            break; 
        case "P4": 
            sheetE.getRange("C5").setValue(endDateE); 
            break; 
        case "P5": 
            sheetE.getRange("C6").setValue(endDateE); 
            break; 
        case "P6": 
            sheetE.getRange("C7").setValue(endDateE); 
            break; 
        case "P7": 
            sheetE.getRange("C8").setValue(endDateE); 
            break; 
        case "P8": 
            sheetE.getRange("C9").setValue(endDateE); 
            break; 
        case "P9": 
            sheetE.getRange("C10").setValue(endDateE); 
            break; 
        case "10": 
            sheetE.getRange("C11").setValue(endDateE); 
            break; 
        case "P11": 
            sheetE.getRange("C12").setValue(endDateE); 
            break; 
    } 
        return appE; 
  }

编辑:

我想我猜你要做的是什么......

实际上,活动的SS和表格总是一样的,你可以用同样的方式重复使用它...(我个人总是保持相同的名字......)见下面更新的处理函数:

function masterFunctionPS(element) { 
  var parameterPS = element.parameter; 
  var appE = UiApp.getActiveApplication(); 
  Logger.log('parameter : '+JSON.stringify(parameterPS));

  var periodE = parameterPS.periodPS; 
  var endDateE = parameterPS.endDatePS; 
//  var activeE = parameterPS.activeSS; // won't work
//  var sheetE = parameterPS.sheetPS; // won't work
  var activeE = SpreadsheetApp.getActiveSpreadsheet(); 
  var sheetE = activeE.getActiveSheet(); 

  switch (periodE)  { 
        case "P1": 
            sheetE.getRange("C2").setValue(endDateE); 
            break; 
        case "P2": 
            sheetE.getRange("C3").setValue(endDateE); 
            break; 
        case "P3": 
            sheetE.getRange("C4").setValue(endDateE); 
            break; 
        case "P4": 
            sheetE.getRange("C5").setValue(endDateE); 
            break; 
        case "P5": 
            sheetE.getRange("C6").setValue(endDateE); 
            break; 
        case "P6": 
            sheetE.getRange("C7").setValue(endDateE); 
            break; 
        case "P7": 
            sheetE.getRange("C8").setValue(endDateE); 
            break; 
        case "P8": 
            sheetE.getRange("C9").setValue(endDateE); 
            break; 
        case "P9": 
            sheetE.getRange("C10").setValue(endDateE); 
            break; 
        case "10": 
            sheetE.getRange("C11").setValue(endDateE); 
            break; 
        case "P11": 
            sheetE.getRange("C12").setValue(endDateE); 


             break; 
        } 
// the following line is only for test... remove it when it works!!! 
            sheetE.getRange("A1").setValue('failed to write value '+endDateE); 
         return appE; 
    }