Date
判斷試算表儲存格是否為日期
GAS
function readOneRow(rowNumber) {
var rowIndex = (rowNumber - 1);
var sheet = SpreadsheetApp.openById(sheetId).getSheetByName("工作表1");
var dataValues = sheet.getDataRange().getValues(); //超過Z依然可以使用
//var dataValues = sheet.getRange(row,1,10).getValues(); //超過Z無法用getRange()讀取
//var last = sheet.getLastColumn(); //可以讀到欄數
if ( rowIndex >= 0 ) {
var rowData = dataValues[rowIndex];
// 將日期欄位轉換為字串
for (var i = 0; i < rowData.length; i++) {
if (rowData[i] instanceof Date) { //用這句來判斷儲存格內是否為日期
var date = rowData[i];
var yyyy = date.getFullYear() + "-";
var mm = date.getMonth() + 1 + "-";
var dd = date.getDate();
var date = yyyy + mm + dd;
rowData[i] = date;
}
}
return rowData;
}
把回傳的日期指定給html日期物件
html
var dateObject = new Date(data[2]);
var birthday = document.getElementById("birthday");
var year = dateObject.getFullYear();
var month = (dateObject.getMonth() + 1).toString().padStart(2, "0");
var day = dateObject.getDate().toString().padStart(2, "0");
var formattedDate = year + "-" + month + "-" + day;
birthday.value = formattedDate;
Google Apps Script日期轉換可能會把你卡住~~~
從Google試算表讀取一欄以html日期選擇器寫入的元素,直接給某一個變數回傳給前端html,以document.getElementById("id")給值,結果是null。
錯誤範例
前端html<input type="date" id="birthday" name="birthday"/>將選到日期寫入試算表「2023-06-25」。
後端GAS:var date = sheet.getRange(1,2).getValue(); //以getValue讀取第1列第2欄元素
回傳給前端: return data;
前端html接收該值:document.getElementById("birthday").value = date; 程式會發生錯誤(該指令以下均不執行)
正確做法
getFullYear(): 取四位西元年
getMonth(): 取月份,記得要+1
getDate(): 取日
後端GAS:var date = sheet.getRange(1,2).getValue(); //以getValue讀取第1列第2欄元素
處理一下:var tmpdate = date.getFullYear() + "-" + (date.getMonth()+1) + "-" + date.getDate();
birthday = tmpdate;
return data;
可以順利轉回日期型態,但是,月、日為個位數時,無法補前導0。
改良月、日兩位數版本
var tmpdate = date.getFullYear() + "-" + ((date.getMonth()+1).length === 2 ? (date.getMonth() + 1) : "0" + (date.getMonth()+1)) + "-" + (date.getDate().length === 2 ? date.getDate() : "0" + date.getDate());
可惜,這個依然會誤判!!「可能是一次多個函數所造成」。
避開可能的因素,改良成一次只執行一個函數。
var range = sheet.getRange(列號,欄); //取得儲存格實際位置
var date = range.getValue(); //取得日期
var yyyy = date.getFullYear();
var mm = ( date.getMonth() + 1 ).toString();
var dd = (date.getDate()).toString();
var selectdate = yyyy + "-" + mm;
if (selectdate.length < 7){
selectdate = yyyy + "-" + "0" + mm;
}
var tmpdate = selectdate + "-" + dd;
if (tmpdate.length < 10){
tmpdate = selectdate + "-" + "0" + dd;
}
selectdate = tmpdate;
最後乾脆自己寫一個function來轉換:
/** 日期轉換 */
function convertDate(inDate){
var yyyy = inDate.getFullYear();
var mm = inDate.getMonth() + 1; //JavaScript Date objects use zero-based indexing for months.
var dd = inDate.getDate();
var tmpdate = yyyy + "-" + mm;
if (tmpdate.length < 7){
tmpdate = yyyy + "-" + "0" + mm;
}
var outDate = tmpdate + "-" + dd;
if (outDate.length < 10){
outDate = tmpdate + "-" + "0" + dd;
}
return outDate;
}