从主列表导入数据至录入表单时遇日期类型转换错误求助
问题描述
从「Billing Masterlist(账单主列表)」向「Data Entry Form(数据录入表单)」搜索导入数据时,弹出错误提示:Date is a text and cannot be coerced to a number(日期为文本类型,无法转换为数字)。表单G列设有计算E、F两列日期间隔天数的公式,但点击搜索按钮拉取数据时仍触发该错误。
已尝试格式化列,但搜索导入数据时日期仍会转为文本类型而非数字,所用代码如下:
var SPREADSHEET_NAME = "Billing Masterlist" var SEARCH_COL_year = 0; var SEARCH_COL_hospital = 1; function searchStr() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var formSS = ss.getSheetByName("Data Entry Form"); var hospital = formSS.getRange("B7").getValue(); var year = formSS.getRange("D7").getValue(); var values = ss.getSheetByName("Billing Masterlist").getDataRange().getValues(); var cont = 0; for (var i = 0; i < values.length; i++) { var row = values[i]; if ((row[SEARCH_COL_year] == year && row[SEARCH_COL_hospital] == hospital )) { var s = (11 + cont).toString(); formSS.getRange("B" + s).setValue(row[2]); formSS.getRange("E" + s).setValue(row[4]); formSS.getRange("F" + s).setValue(row[5]); cont = cont + 1; } } }
解决方案
问题核心是导入的日期以文本格式存入表单,而谷歌表格的日期计算公式依赖数值类型的日期(谷歌表格中日期本质是代表时间戳的数值)。只需修改代码,将导入的日期转换为谷歌表格可识别的日期对象即可解决:
把代码中设置E、F列日期的两行替换为:
formSS.getRange("E" + s).setValue(new Date(row[4])); formSS.getRange("F" + s).setValue(new Date(row[5]));
new Date()会将文本格式的日期字符串转换为标准Date对象,谷歌表格会自动将其识别为数值类型的日期,G列的日期间隔公式就能正常计算了。
如果原数据中的日期本身是Date对象但被异常转为文本,也可以用时间戳转换为谷歌表格日期数值的方式:
// 将JS时间戳转换为谷歌表格日期数值 formSS.getRange("E" + s).setValue(row[4].getTime() / 86400 + 25569); formSS.getRange("F" + s).setValue(row[5].getTime() / 86400 + 25569);
内容的提问来源于stack exchange,提问作者Cyril_Leonel
相关产品推荐
相关产品推荐

