0

スプレッドシートの特定のセル値が変更されたときにタイムラインを出力する関数が必要です。

セル A1 は、時々変更される値です。A1が変更されると、現在の値がB1に追加されます。C1 は、値が変更されたタイムスタンプを示します。

次に A1 が変更されると、新しい値が B2 に表示され、タイムスタンプが C2 に表示されます。3 番目の変更は B3/B4 に、4 番目は B4/C4 に、というように続きます。

これは通常のすべての Google フォームが行う機能のように思えますが、これをカスタム スクリプトに変換する方法がわかりません。

誰でも助けてもらえますか?

4

1 に答える 1

1

これは、あなたが望むことを行うコード例です。プッシュまたはシフト解除を使用して、新しい値を列 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
 }
于 2013-03-04T17:41:10.387 に答える