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;

}