Как заставить листы Google автоматически добавлять порядковый номер текущей строки на основе новой записи следующего критерия в этой конкретной строке?
Как заставить его работать, даже если данные не вводятся внепрерывная строка (например, 1-я запись в строке 1 (скажем, ячейка B1), 2-я запись в строке 2 (в B2), 3-я запись в строке 3 (B3), но затем 4-я запись в строке 9 (B9), 5-я в строке)11 (B11), 6-й в строке (B7))?
И не добавлять порядковые номера в промежуточные пустые строки (например, когда B5 / row5, B6 / row6, B8 / row8, B10 / row10 и т. Д. Являются пробелами, не добавляйте порядковые номера к A5 / row5, A6 / row6, A8 / row8, A10 / row10 и т. д.)?
Вот ожидаемый результат:
Таблица: Порядковые числа в несмежные строки на основе временных меток ввода данных
До сих пор я придумал эту формулу раскрытия (чтобы бытьпредварительно настроенный в A2 и перетаскиваемый до A12):
=IF(B2<>"",MAX($A$2:$A)+1,"") [in A2]
=IF(B3<>"",MAX($A$2:$A)+1,"") [in A3]
=IF(B4<>"",MAX($A$2:$A)+1,"") [in A4]
=IF(B5<>"",MAX($A$2:$A)+1,"") [in A5]
=IF(B6<>"",MAX($A$2:$A)+1,"") [in A6]
=IF(B7<>"",MAX($A$2:$A)+1,"") [in A7]
=IF(B8<>"",MAX($A$2:$A)+1,"") [in A8]
=IF(B9<>"",MAX($A$2:$A)+1,"") [in A9]
=IF(B10<>"",MAX($A$2:$A)+1,"") [in A10]
=IF(B11<>"",MAX($A$2:$A)+1,"") [in A11]
=IF(B12<>"",MAX($A$2:$A)+1,"") [in A12]
Но результат, который я получаю при вводе данных, последовательно, один за другим в B2, B3, B4, B7, B9 и B12, это то, что он обновляет все предыдущие ячейки новым максимальным значением, чтобы успех не был достигнут.
Вот рисунок, который показывает живой результат:
https://i.imgur.com/1I1Dk8f.gifv
Как заблокировать предыдущие результаты, чтобы порядковый номер мог перейти к следующей записи, когда это происходит последовательно?
Я ознакомился с теми постами, которые близки к тому, что яищу:
Как заменить формулу с ее результатом?
с помощью этого сценария:
function freezeOutput(){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("SummarySheet");
var range = sheet.getRange("A1:A10");
range.copyTo(range, {contentsOnly:true});
}
Остановить Excel изОбновление формулы после соответствия критерия
с использованием этой формулы:
=IF(NOW() < C1,2*A1,A2)
В качестве альтернативы этот код VBA:
Function EvaluateIf(expression As String, condition As Boolean) As Variant
Application.Volatile
Dim myText As String
Dim myVal As Variant
If condition Then
myVal = Application.Evaluate(expression)
Else
myText = Application.Caller.Text
If IsNumeric(myText) Then
myVal = Val(myText)
Else
myVal = myText
End If
End If
EvaluateIf = myVal
End Function
Function FreezeAfter(expression As String, deadline As Date) As Variant
Application.Volatile
Dim myText As String
Dim myVal As Variant
If Now > deadline Then
myText = Application.Caller.Text
If IsNumeric(myText) Then
myVal = Val(myText)
Else
myVal = myText
End If
Else
myVal = Application.Evaluate(expression)
End If
FreezeAfter = myVal
End Function
Как скопироватьзначения ячеек программно?
с использованием этого сценария:
function getRangeValues() {
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getRange("A2:B4");
var values = range.getValues();
return values;
};
С Sheet here: Программно скопировать значения ячеек (72539)
Наконец:
Добавление текущей даты в лист при добавлении данных, чтобы дата не изменялась (статическая) - Перейтиogle Sheets
с использованием этого сценария:
/**
* Creates a Date Stamp if a column is edited.
* https://yagisanatode.com/2018/02/21/add-the-current-date-to-a-sheet-when-data-is-added-so-that-the-date-does-not-changestatic-google-sheets/
*/
//CORE VARIABLES
// The column you want to check if something is entered.
var COLUMNTOCHECK = 6;
// Where you want the date time stamp offset from the input location. [row, column]
var DATETIMELOCATION = [0,-5];
// Sheet you are working on
var SHEETNAME = 'Sheet3'
function onEdit(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
//checks that we're on the correct sheet.
if( sheet.getSheetName() == SHEETNAME ) {
var selectedCell = ss.getActiveCell();
//checks the column to ensure it is on the one we want to cause the date to appear.
if( selectedCell.getColumn() == COLUMNTOCHECK) {
var dateTimeCell = selectedCell.offset(DATETIMELOCATION[0],DATETIMELOCATION[8]);
dateTimeCell.setValue(new Date());
}
}
}
Но я не понимаю, как заставить это работать.
Ожидаемый результат можно просто добавить порядковымномер соответствующей ячейке в столбце A при вводе данных в соответствующую ячейку в столбце B.
Как мы это сделаем?