(2020/03/21 追記)
2020年2月に GASで V8ランタイム が使えるようになりました。これによりECMAScriptに対応をしたようです。それまでは Rhinoランタイム だったそうです。この記事を投稿したときは Rhinoランタイム でしたが、下記の記事は V8ランタイム でも同じ結果になりました。
下記のようなスプレッドシートがあって、列によって「表示形式」が異なります。
function main(){
const sheet = SpreadsheetApp.getActiveSheet();
const jidou = sheet.getRange('A2').getValue();
const hiduke = sheet.getRange('B2').getValue();
const nichiji = sheet.getRange('C2').getValue();
const nashi = sheet.getRange('D2').getValue();
// typeofで判定
Logger.log(typeof jidou); // -> object
Logger.log(typeof hiduke); // -> object
Logger.log(typeof nichiji); // -> object
Logger.log(typeof nashi); // -> string
// Object.prototype.toString.call()で判定
Logger.log(Object.prototype.toString.call(jidou)); // -> [object Date]
Logger.log(Object.prototype.toString.call(hiduke)); // -> [object Date]
Logger.log(Object.prototype.toString.call(nichiji)); // -> [object Date]
Logger.log(Object.prototype.toString.call(nashi)); // -> [object String]
}
表示形式が「書式なしテキスト」だと、GASの中ではStringになりました。
GAS側でDateオブジェクトとして扱ってる場合、スプレッドシート側の表示形式をいじられると困ることになるかも?
2023/10/30追記
コメントにて getDisplayValue(s)を使う技を教えていただきましたのでそちらも参照してください!