Google Script:带有下拉列表电子表格的InputBox(非FORM)

时间:2014-08-31 11:32:59

标签: google-apps-script google-sheets

我有这个简单的脚本:

function myFunction() {
  var ssh = SpreadsheetApp.getActiveSpreadsheet();
  var ss = ssh.getActiveSheet();
  var s = ss.getActiveRange();


  var rowIndex = s.getRowIndex();
  var colIndex = s.getColumnIndex();

  // Get the number of columns in the active sheet.
  var colNumber = ss.getLastColumn();
  if (colIndex == 1 && rowIndex != 1) {

  //Get User Name from inputBox
  var name = Browser.inputBox('Owner', 'Enter your Name', Browser.Buttons.OK_CANCEL);
  var r1 = ss.getActiveRange().getRow();
  //Insert the Name in the active row in the column 6
  ss.getRange(r1, 6).setValue(name)

  //Here I have other part of the code but is for copy rows to other sheet.

}
}

在第6列中有活动数据验证(不允许插入值不在项目列表中)。 例如:查尔斯,奥斯卡,保罗,其他。如果我输入名称全部为小写,请不要输入。如果输入的值与“Charles”相同,则输入值。

现在,这些值可能会在输入框中显示为下拉列表吗?我的意思是,用户可以从该列表中进行选择,然后按Enter键或确定,并将值插入单元格中。

注意:这不是表格。这是电子表格。

谢谢,

更新日期:01/09/2014

function Historic(e) { //CopyRows
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getActiveSheet();
    if (s.getName() == 'ISP1'){
  var r = SpreadsheetApp.getActiveRange();

  // Get the row and column of the active cell.
  var rowIndex = r.getRowIndex();
  var colIndex = r.getColumnIndex();

  // Get the number of columns in the active sheet.
  var colNumber = s.getLastColumn();


    // Move row based on criteria in column 1, and if row is not the header.
    if (colIndex == 1 && rowIndex != 1) { // 1 Is the Comment Column

    //Call the Function Menu List
    showNamePicker();

    //Get values for the active row bases on the criteria.
    var status = s.getRange(rowIndex, colIndex).getValue();

// --------------- Copy ROW only when someone modify the Column1 --------------------------

       // Do nothing if criteria value is not actually changed to something else.
    if (s.getName() != 'Historic') { 
      // The target sheet is the one with the same name as the criteria value.
      var targetSheet = ss.getSheetByName('Historic');
      var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);

      //=====Copy the Row from ISP1 to Historic=======
      s.getRange(rowIndex, 1, 1, colNumber).copyTo(target);
}      
}
}
}




function showNamePicker() {
  var app = UiApp.createApplication().setHeight(100).setWidth(180);
  var handler = app.createServerHandler('setName');
  var list = app.createListBox().setName('list').addChangeHandler(handler);
  var names = ['Choose a name here','Charles', 'Oscar', 'Paul', 'Other'];
  for(var n in names){
    list.addItem(names[n]);
  }
  handler.addCallbackElement(list);
  app.add(list);
  SpreadsheetApp.getActive().show(app);
  }


function setName(e){
  var ssh = SpreadsheetApp.getActiveSpreadsheet();
  var ss = ssh.getActiveSheet();
  var r1 = ss.getActiveRange().getRow();
  ss.getRange(r1, 6).setValue(e.parameter.list);
}
  

功能历史记录:如果有人修改了第1列,脚本会将修改的行中的所有数据复制到历史记录。

需要:

  

在脚本将行复制到历史记录之前,脚本应该在该行的第6列中插入名称。

问题:

  

当有人修改第1列时,用户按ENTER键并且新的活动行发生更改,因为它们不相同且脚本未在修改的行中插入名称。   例如:   我修改A2并按ENTER键,新行是A3,脚本将信息插入F3而不是F2。

我尝试在此行之前调用该函数:
//根据条件获取活动行的值。
var status = s.getRange(rowIndex,colIndex).getValue();

但我还是新手......我这很容易,但我无法解决这个问题。

如果你能帮助我,我将不胜感激。

实施例

  

更改单元格A2 = ID#12578   脚本应该在F2列中插入名称,然后复制所有行,包括名为Historic的表格中的F2。 (脚本未将名称插入F2插入F3

1 个答案:

答案 0 :(得分:3)

您必须使用一个对话框替换Browser.inputBox,该对话框将包含一个包含所需值的列表框。

您可以使用UiApp或HTML服务构建此对话框。

问题是没有任何东西可以阻止直接在单元格中输入值,但在您的代码中就是这种情况......

您可以将列表值存储在隐藏列,另一个工作表,另一个电子表格或ScriptProperties或代码本身中的任何位置......这是一个选择问题:-)

编辑:使用UiApp的一个小例子:

function showNamePicker() {
  var app = UiApp.createApplication().setHeight(100).setWidth(120);
  var handler = app.createServerHandler('setName');
  var list = app.createListBox().setName('list').addChangeHandler(handler);
  var names = ['Choose a name here','Charles', 'Oscar', 'Paul', 'Other'];
  for(var n in names){
    list.addItem(names[n]);
  }
  handler.addCallbackElement(list);
  app.add(list);
  SpreadsheetApp.getActive().show(app);
  }


function setName(e){
  var ssh = SpreadsheetApp.getActiveSpreadsheet();
  var ss = ssh.getActiveSheet();
  var r1 = ss.getActiveRange().getRow();
  ss.getRange(r1-1, 6).setValue(e.parameter.list);
  return UiApp.getActiveApplication().close();// close the Ui
}