使用setDataValidation的下拉列表中出现意外行为

时间:2014-03-17 00:28:50

标签: google-apps-script

我写了这个函数,在我的电子表格的非使用单元格中插入一个下拉列表:

function insertDropdownList(folderID){
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 
    var lastRow = sheet.getLastRow();
    var options = [];
  Logger.log("options = " + options);
    var folder = DocsList.getFolderById(folderID);
    var files = folder.getFiles();
    for (var i in files) {     
        var item = files[i].getName(); 
      Logger.log("item = " + item);
        options.push(item);
    }
    Logger.log("options2 = " + options);
    var range = sheet.getRange(lastRow+1, getColumnNrByName(sheet, "COLUMN NAME")+1, sheet.getMaxRows());
    var rule = SpreadsheetApp.newDataValidation().requireValueInList(options, false).build();
    range.setDataValidation(rule); 
} 

但是尽管options数组没有问题,但是在预期内容中,插入单元格中的下拉列表会根据文件标题中的逗号进行拆分。这些文件:

enter image description here

成为此下拉列表(其中Larry Page名称被拆分为另一个项目,而不是两个名称的一部分):

enter image description here

我尝试过这样的事情:options.push([item]);"Larry Page, on Why Moon Shots Matter"。但没有任何效果。如何解决这个问题?

documentation

enter image description here

2 个答案:

答案 0 :(得分:4)

我不相信您可以将逗号保留在选项列表中。 javascript中没有逗号的转义字符。并且您的选项数组最终为单个字符串,然后使用逗号作为分隔符进行拆分。可视化正在发生的事情的最简单方法是通过UI查看数据验证。

enter image description here

最简单的解决方法是用另一个分隔符替换逗号。 E.g。

 var item = files[i].getName().replace(',',' -'); 

enter image description here

我认为这样做的另一种方式是更接近您要查找的内容,将填充隐藏列/表中的文件名列表,并使用.requreValueInRange。这样就可以使用逗号进行正确的格式化。

enter image description here

function setList() {
  try{
   var folderId = '0B899iW4paMb-RUGUdHRtYzJwQTQ';
   insertDropdownList(folderId);
  }catch(err){
    Logger.log(err.lineNumber + ' - ' + err);
  }
}


function insertDropdownList(folderID){
  try{
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 
    // use fileRange to store list of file names for validation selection
    var fileRange = sheet.getRange("K1");
    var lastRow = sheet.getLastRow();
    var options = [];
    var r = 0;  // counter for rows when populating file list from Drive
    var folder = DriveApp.getFolderById(folderID);
    var files = folder.getFiles();
    while(files.hasNext()){
        var item = files.next().getName(); 
        fileRange.offset(r,0).setValue(item);
        r += 1;
    }
    var fileListRange = sheet.getRange("K1:K" + (r+1));
    var range = sheet.getRange(1, 1, lastRow,1);
    var rule =       SpreadsheetApp.newDataValidation().requireValueInRange(fileListRange,false).build();
    range.setDataValidation(rule); 
    sheet.hideColumn(fileListRange); // hide the validation column
  }catch(err){
    Logger.log(err.lineNumber + ' - ' + err);
  }
}

答案 1 :(得分:0)

您可以尝试使用,

替换逗号