【问题标题】:Creating a drop-down list of Dates in Google Forms from values on a Google Sheet creates list of Strings instead从 Google 表格上的值创建 Google 表单中的日期下拉列表会改为创建字符串列表
【发布时间】:2026-02-10 21:15:02
【问题描述】:

我创建了一个脚本,允许我使用电子表格中的数据在 Google 表单中创建一个动态下拉列表。电子表格中的数据是日期列表,但当它被添加到 Google 表单的下拉列表中时,它会变成一个字符串。当有人提交回复时,数据会进入电子表格,并且该下拉列表的值被视为字符串而不是日期,例如'5/5/2018 而不是 5/5/2018

var fromRange = 'RequestDates'; //namedRange from Spreadsheet for 'From date' dropdown
var toRange = 'RequestToDates'; //namedRange from Spreadsheet for 'To date' dropdown

function updateDates(e){
  // a way to get the items from the form
  var form = FormApp.openById("10uyPYIpVtKLg5eaxIrc8di93v7NW1ZSL6gjbtQs4NvE");
  var FromList = form.getItemById(1.403587334E9).asListItem();
  var ToList = form.getItemById(4.09925665E8).asListItem();

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var FormsTest = ss.getSheetByName("AppScript");

  // get the values in the first column accept header row 1
  var FromValues = FormsTest.getRange('RequestDates').getDisplayValues();
  var ToValues = FormsTest.getRange('RequestToDates').getDisplayValues(); 

  var FromNames = [];
  for(var i = 0; i < FromValues.length; i++) {  
    if(FromValues[i][0] != "") {
      FromNames[i] = FromValues[i][0];
    }
  }

  var ToNames = [];
  for(var y = 0; y < ToValues.length; y++) {  
    if(ToValues[y][0] != "") {
      ToNames[y] = ToValues[y][0];
    }
  }

  // populate the list
  FromList.setChoiceValues(FromNames);
  ToList.setChoiceValues(ToNames);
}

电子表格中的日期列表每天都会自动更新,仅允许当天后 12 天到当天后 180 天,这意味着动态下拉菜单也会每天自动更新。我对 javascript 很陌生,所以任何建议都将不胜感激。

【问题讨论】:

  • 使用 JavaScript 字符串方法(如 substring 或 slice 或 replace)删除前导单引号。然后使用新的 Date(string) 构造函数。它非常健壮,可能会识别模式并将其强制转换为日期。
  • 例如,我的日期在 C2:C 范围内,如何使用切片或替换来删除单引号?我试过 function dateformat(e){ var ss = SpreadsheetApp.getActiveSpreadsheet() var FormResponse = ss.getSheetByName("Form Responses 2"); var dateRange = FormResponse.getRange("C2:C"); dateRange.getValues().slice(0); } 但它不起作用
  • var data=dareRange.getValues() 中的第一个值是 data[0][0] (即它是二维的)所以它是 data[0][0].slice(1)
  • 对不起,我对这一切都很陌生,它应该看起来像这样吗? 'dateRange.getValues().data[0][0].slice(1);'
  • 在您的原始脚本中使用 getValues() 而不是 getDisplayValues() 怎么样

标签: google-apps-script google-sheets google-forms


【解决方案1】:

试试这个:

function dateformat(e){ //I presume your in a spreadsheet getting an onFormatSubmit trigger
  var sh=e.range.getSheet();
  var rg = sh.getRange(2,3,sh.getLastRow(),1); 
  var data=rg.getValues(); //the plan would be to iterate over all of the rows I guess. 
  for(var i=0;i<data.length;i++){
    var datstr=String(data[i][0]).slice(1);
    data[i][0]=new Date(datstr);
  }
  rg.setValues(data);//This will replace the strings with the date values and you can set the format for that range anyway you wish.
}

【讨论】:

  • 我收到一条错误消息,上面写着“Missing ; before statement”。在这一行 var data[i][0]=new Date(datstr);我的代码看起来和你发布的一模一样,所以我不确定我应该把它放在哪里;
  • 我稍微修改了代码。它说 var data[i][0] 只需删除 var。
  • 所以我又试了一次,它成功了!虽然我必须稍微更改代码:'var rg = sh.getRange(2,3,sh.getLastRow(),1)' 到 'var rg = sh.getRange(2,3,sh.getLastRow()- 1,1)' 和 'var datstr=String(data[i][0]).slice(1);'到 'var datstr=String(data[i][0]).replace("'","");' ,谢谢库珀!