【问题标题】:Google Script: InputBox with drop down list spreadsheet (Not FORM)Google Script:带有下拉列表电子表格的 InputBox(不是 FORM)
【发布时间】:2014-10-24 20:08:38
【问题描述】:

我有这个简单的脚本:

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 或 Ok 并将值插入到单元格中。

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

谢谢,

更新日期:2014 年 1 月 9 日

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);
}

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

需要:

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

问题:

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

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

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

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

示例:

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

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    您必须将 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
    }
    

    【讨论】:

    • 非常感谢...请在我尝试实施脚本时查看我的问题。
    • 抱歉,我看不出你有什么问题……你能解释一下吗?
    • 查看我的更新 01/09/2014....//当 somone 修改第 1 列时用户按 ENTER 并且新的活动行更改因为不一样并且脚本没有插入名称在被修改的行中。例如:我修改了A1并按ENTER新行是A2,脚本会将信息插入F2而不是F2。///我还需要在脚本获取实际行的值之前插入名称.
    • 您的意思是 F2 而不是 F1。对吗?
    • 抱歉,在我上次更新的基础上,脚本只会在某些人修改任何行 > 1 且列 = 1 时运行。 ////更改单元格 A2 = ID#12578 应该插入脚本F2 列中的名称,然后复制所有行,包括名为 Historic 的工作表中的 F2。 (脚本不是在F2中插入名字就是在F3中插入/////
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多