これは、あなたが望むことを行うコード例です。プッシュまたはシフト解除を使用して、新しい値を列 B および C の上または下に追加するかどうかを選択できます...コメントで与えた理由により、シフト解除を好みますしかし、それはあなた次第です;-)
function timeline() {
var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
if(sh.getActiveRange().getA1Notation()!='A1'){return}
var last = lastRowinCol(sh,'B');
var cellA = sh.getRange('A1').getValues();
var colB = sh.getRange('B1:B'+last).getValues();
var colC = sh.getRange('C1:C'+last).getValues();
// colB.unshift(cellA); // add on top
// colC.unshift([new Date()]);
colB.push(cellA); //add at the bottom
colC.push([new Date()]);
sh.getRange(1,2,colB.length,1).setValues(colB);
sh.getRange(1,3,colC.length,1).setValues(colC);
}
function lastRowinCol(sh,col){
var coldata = sh.getRange(col+'1:'+col).getValues();
for(var c in coldata){if(coldata[c][0]==''){break}}
return c
}
注:これを実装する方法は他にもありますが、これはかなり「教訓的」だと思います...配列、サブ関数呼び出し、バッチ読み取りと書き込みを使用しています...
編集: 自動的に実行するには、その関数に onEdit トリガーを割り当てる必要があることを忘れていました。
EDIT 2 :以下の Mogsdad からの非常に適切なコメントに従って、 for-next ループをfunction lastRowinCol
、列内の空のセルを処理するように逆方向に反復する彼のコードに置き換えることをお勧めします。さらに、ループ制限と条件が同じステートメント内にあるため、彼のコードは興味深い構造を持っています。
function lastRowinCol(sh,col){
var coldata = sh.getRange(col+'1:'+col).getValues();
for (var c=coldata.length; (c) && coldata[c-1][0]==''; c--) {}
return c
}