
スプレッドシートでは、行内のセルに変更が加えられるとすぐに、各行に日付スタンプが必要になります。たとえば、セル B14、E14、または G14 で何かを変更すると、今日の日付が K14 に表示されます。当然、影響を受ける行と列の範囲を選択できる必要があります。
しかし、私の場合複雑なのは、今日の日付を表示する必要があることですのみ私が追加または変化セル内の情報。消去セルからの情報を削除する前と同じ日付を維持する必要があります。
PS このファイルは Excel スプレッドシートですが、Google ドライブで使用されます。
答え1
この答えは、Google スプレッドシートに直接アクセスした場合のものです。
これは、正しい方向に進むのに役立つと思います。監視するフィールドがシート全体に散らばっていると言っているのか、参照した隣接していないセルが範囲内の例にすぎないのかは不明です。セルが散在している場合は、コードで説明したように複数の「監視範囲」を作成し、編集中のセルが少なくとも 1 つの範囲内にあることを確認する必要があります。そうでない場合は、関数から戻ります。
複数セル範囲からすべての値を削除することをサポートするために、これを機能させるために余分な手間をかけなかったことに注意してください。
また、Google スプレッドシート内で [ツール] -> [スクリプト エディタ] に移動し、[リソース] -> [トリガー] (メニューは、以前に行った操作によって異なる場合があります) に移動して、シートに "onEdit()" トリガーを追加する必要があることに注意してください。
すると、関数は次のようになります
function onEdit(e){
var DateCol = "K";
var DeletedColNote = "L";
var curDate = Utilities.formatDate(new Date(), "GMT-5", "MM/dd/yyyy")
var editRange = e.range;
var rowIndex = editRange.getRowIndex();
var colIndex = editRange.getColumnIndex();
// May need to set up multiple ranges like this and check all ranges if
// checked fields are not in adjacent cells
var watchRange = { // B2:G20
top : 2, // start row
bottom : 20, // end row
left : 2, // start col
right : 7 // end col
};
// Exit if we're out of range
if (rowIndex < watchRange.top || rowIndex > watchRange.bottom) return;
if (colIndex < watchRange.left || colIndex > watchRange.right) return;
var currentValue = editRange.getValue();
currentValue = currentValue.replace(/^\s+|\s+$/g,""); //"trim" kludge
if (currentValue.length == 0)
{
// Set a column to show when data was deleted
SpreadsheetApp.getActiveSheet().getRange(DeletedColNote + rowIndex).setValue("Deleted: " + curDate);
}
else
{
// Set a column to show last edit date
SpreadsheetApp.getActiveSheet().getRange(DateCol + rowIndex).setValue("Edited: " + curDate);
SpreadsheetApp.getActiveSheet().getRange(DeletedColNote + rowIndex).setValue("");
}
}
答え2
残念ながら、VBA は Google スプレッドシートに移植できませんが、Google スプレッドシートの要件が免除されれば、VBA で移植するのは非常に簡単です。
対象のワークシートの WorkSheet_Change イベントにこのコードを添付します...
Private Sub Worksheet_Change(ByVal Target As Range)
Dim RngToMark As Range
' define the range you want to track changes for
Set RngToMark = ActiveSheet.Range("A1:G30")
' make sure the change occurred inside the range
If Intersect(Target, RngToMark) Is Nothing Then Exit Sub
' ignore deleting the contents
If Target.Value = "" Then Exit Sub
' mark the row as changed
ActiveSheet.Range("K" & Target.Row).Value = Format(Now(), "MMM-DD-YYYY")
End Sub
これを挿入する正しい位置に到達するには...
- VBEditorで、「Microsoft Excelオブジェクト」の下のワークシート名をダブルクリックします。
- 次に、左側のドロップダウンからワークシートを選択します。
- 次に右側のドロップダウンから変更を選択します