Google Apps Script转JSON日期格式可读性问题求助
解决Google Sheets日期转JSON后格式变为ISO 8601的问题
问题的核心原因是:Google Sheets中的日期在Apps Script里会被解析成Date对象,当你用JSON.stringify()转换时,Date对象会自动序列化为ISO 8601格式的字符串(比如2023-01-17T14:17:35.270Z)。下面提供两种可行的解决思路,你可以根据需求选择:
方案一:在Apps Script后端提前格式化日期
这种方法的好处是前端不需要额外处理,直接使用格式化好的字符串即可。修改你的Apps Script代码,在将单元格值存入record时,判断是否为日期对象,然后格式化为你需要的dd/MM/yyyy HH:mm:ss格式:
function doGet(e) { var sheet = SpreadsheetApp.getActive(); var nse = sheet.getSheetByName("Sheet1"); var data = []; var rlen = nse.getLastRow(); var clen = nse.getLastColumn(); var rows = nse.getRange(1,1, rlen, clen).getValues(); // 替换成你Google Sheets对应的时区,比如印度时区是"Asia/Kolkata",按需调整 const TIME_ZONE = "Asia/Kolkata"; const DATE_FORMAT = "dd/MM/yyyy HH:mm:ss"; for(var i = 1; i < rows.length; i++) { var datarow = rows[i]; var record = {}; for(var j=0; j < clen ; j++){ var cellValue = datarow[j]; // 判断是否为日期对象,是的话格式化 if (cellValue instanceof Date) { cellValue = Utilities.formatDate(cellValue, TIME_ZONE, DATE_FORMAT); } record[rows[0][j]] = cellValue; } data.push(record); } var result = JSON.stringify(data); return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JSON); }
关键说明:
Utilities.formatDate()需要三个参数:日期对象、时区字符串、格式字符串。时区可以参考IANA时区数据库选择合适的值,确保和你Google Sheets里的时区一致。- 格式字符串中的
dd代表两位数的日期,MM是两位数的月份(注意大写,小写mm是分钟),HH是24小时制的小时,mm是分钟,ss是秒。
方案二:在前端JavaScript中格式化日期
如果你不想修改后端代码,可以在前端拿到ISO日期字符串后,转换为可读格式。下面是修改后的前端代码,包含一个日期格式化函数:
<section> <h1>My Google Sheet Table</h1> <!-- TABLE CONSTRUCTION--> <table id='mytable'> <!-- HEADING FORMATION --> <tr> <th>Date</th> <th>Name</th> <th>Phone Number</th> <th>Months</th> </tr> <script> // 定义日期格式化函数,处理UTC转当地时区(这里以UTC+5.5为例,对应印度时区) function formatISODate(isoDateStr, utcOffsetHours) { const date = new Date(isoDateStr); // 调整时区偏移 date.setHours(date.getUTCHours() + utcOffsetHours); // 提取各部分并补零 const day = String(date.getDate()).padStart(2, '0'); const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,所以+1 const year = date.getFullYear(); const hours = String(date.getHours()).padStart(2, '0'); const minutes = String(date.getMinutes()).padStart(2, '0'); const seconds = String(date.getSeconds()).padStart(2, '0'); return `${day}/${month}/${year} ${hours}:${minutes}:${seconds}`; } $(document).ready(function () { // FETCHING DATA FROM JSON FILE $.getJSON("JsonDataLink", function (data) { var content = ''; // ITERATING THROUGH OBJECTS $.each(data, function (key, value) { // 使用格式化函数处理日期 const formattedDate = formatISODate(value.DATE, 5.5); //CONSTRUCTION OF ROWS HAVING // DATA FROM JSON OBJECT content += '<tr>'; content += '<td>' + formattedDate + '</td>'; content += '<td>' + value.Name + '</td>'; content += '<td>' + value.Phone + '</td>'; content += '<td>' + value.Months + '</td>'; content += '</tr>'; }); //INSERTING ROWS INTO TABLE $('#mytable').append(content); }); }); </script> </section> </body> </html>
关键说明:
formatISODate函数接收ISO日期字符串和UTC偏移小时数(比如印度时区是UTC+5.5,所以传5.5),将UTC时间转换为当地时间后再格式化。- 如果你的时区是整数偏移(比如UTC+8),直接传对应的数字即可。
padStart(2, '0')用来确保日期、月份、时间部分都是两位数(比如1月变成01,9点变成09)。
内容的提问来源于stack exchange,提问作者Ali Khan
相关产品推荐
相关产品推荐

