Как автоматически добавить порядковый номер записи, основанной на метке времени, в строку, когда в Google Sheets добавляются несмежные новые данные? - PullRequest
0 голосов
/ 31 мая 2019

Как заставить листы 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 и т. д.)?

Вот ожидаемый результат:

Ordinals to non-contiguous rows based on data entry timestamps

Таблица: Порядковые числа в несмежные строки на основе временных меток ввода данных

До сих пор я придумал эту формулу раскрытия (чтобы бытьпредварительно настроенный в 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.

Как мы это сделаем?

1 Ответ

1 голос
/ 31 мая 2019

Поток:

  • Использование триггера редактирования для захвата событий в столбце B
  • Получить все столбцы A при редактировании столбца B
  • Рассчитать максимум столбца Aи добавьте 1
  • SetValue максимум к Col A

Фрагмент:

function onEdit(e) {
  var rg = e.range,
    row = rg.rowStart,
    col = rg.columnStart,
    sht = rg.getSheet();

  //exit code
  if (col !== 2 || sht.getName() !== 'Sheet1' || row === 1) return;

  //Calculate max value and add 1
  rg.offset(0, -1, 1, 1).setValue(//setvalue in colA
    rg
      .offset(2 - row, -1, sht.getLastRow() - 1, 1) //get all of colA
      .getValues()
      .reduce(function(acc, curr) {//get max of colA
        return Math.max(acc, Number(curr[0]));
      }, 0) + 1
  );
}

Чтение и практика:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...