google-apps-script spreadsheetでセルの値を[Delete]ボタンで削除した際にも、oldValueを知りたいです。
こんにちは。
function onEdit(e){
var SHEET_ = e.source.getSheetByName("rireki");
SHEET_.appendRow([e.oldValue]);
}
スクリプト実行時にoldValueの値を見る事で、
スプレッドシートのセルの値を編集した時に、
編集する前はどのような値だったのかを"rireki"シートに残したいです。
セルの値を編集した時は、oldValueが期待した通りに記録されますが、
セルの値を[delete]ボタンで削除すると、oldValueはundefinedになってしまいます。
セルの値を[delete]ボタンで削除した際にも、deleteする前の値を知りたいのですが、
それはどのようにすればいいのでしょうか。
簡潔ではありますが、質問は以上になります。
---- 追記 ----
Tanaike様から、教えていただいたページを参考に、
試してみたコードで、一応自分のやりたい事は可能になりました。
以下のコードになります。
function onEdit(e){
var SHEET = e.source.getActiveSheet();
var SHEET_NAME = SHEET.getName()
var RANGE = SHEET.getActiveRange();
var VALUE = RANGE.getValue();
var COL = RANGE.getColumn();
var ROW = RANGE.getRow();
var LOG_SHEET_NAME = "rireki";
var LOG_SHEET = e.source.getSheetByName(LOG_SHEET_NAME) || e.source.insertSheet(LOG_SHEET_NAME);
var _LOG_DATA = LOG_SHEET.getDataRange().getValues();
Logger.log(_LOG_DATA);
var LOG_INDEX = (_LOG_DATA.findIndex(function(x){return (x[0] == SHEET_NAME) && (x[1] == ROW) && (x[2] == COL)})) + 1;
if( LOG_INDEX >= 1){
LOG_SHEET.getRange(LOG_INDEX,5).setValue(_LOG_DATA[LOG_INDEX - 1][3]);
if(typeof e.value === 'string'){
LOG_SHEET.getRange(LOG_INDEX ,4).setValue(e.value);
}else if(typeof e.value === 'object'){
LOG_SHEET.getRange(LOG_INDEX ,4).setValue("");
}
else if(typeof e.value === 'undefined'){
LOG_SHEET.getRange(LOG_INDEX ,4).setValue("");
}else{
}
}else{
LOG_SHEET.insertRowBefore(1);
LOG_SHEET.getRange(1,1,1,5).setNumberFormats([["@","@","@","@","@"]]).setValues([[SHEET_NAME,ROW,COL,VALUE,""]]);
LOG_INDEX = 1;
}
//LOG変更、終了。
e.oldValue = LOG_SHEET.getRange(LOG_INDEX , 5).getValue();
//以下、やりたい事。
}
if (!Array.prototype.findIndex) {
Array.prototype.findIndex = function(predicate) {
if (this === null) {
throw new TypeError('Array.prototype.findIndex called on null or undefined');
}
if (typeof predicate !== 'function') {
throw new TypeError('predicate must be a function');
}
var list = Object(this);
var length = list.length >>> 0;
var thisArg = arguments[1];
var value;
for (var i = 0; i < length; i++) {
value = list[i];
if (predicate.call(thisArg, value, i, list)) {
return i;
}
}
return -1;
};
}