【问题标题】:How to automatically add the ordinal number of an entry based on timstamp to a row when non-contiguous new data is added to it in Google Sheets?当在 Google 表格中添加不连续的新数据时,如何根据时间戳自动将条目的序号添加到行中?
【发布时间】:2019-10-17 01:42:21
【问题描述】:

如何让 Google 表格根据以下条件自动添加当前行的序号“此特定行上的新条目?

即使数据不是连续输入的,如何使其工作(例如,第 1 行的第一个条目(例如单元格 B1),第 2 行的第 2 个条目(在 B2 中),第 3 行的第 3 个条目( B3),然后是第 9 行 (B9) 的第 4 个条目,第 11 行 (B11) 的第 5 个条目,(B7) 行的第 6 个条目?

并且不向中间空行添加序数(例如,当 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 中逐一输入数据时得到的结果是,它使用新的最大值更新所有先前的单元格,因此不会发生继承达到了。

这是一个显示实时结果的 gif:

https://i.imgur.com/1I1Dk8f.gifv

如何锁定之前的结果,使得序数在连续出现时可以进行到下一个条目?

我查阅了那些与我正在寻找的内容接近的帖子:

How do you replace a formula with its result?

使用这个脚本:

function freezeOutput(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("SummarySheet");
  var range = sheet.getRange("A1:A10");     
  range.copyTo(range, {contentsOnly:true});
}

Stop Excel from updating formula after a criteria is matched

使用这个公式:

=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

How do I copy cell values programatically?

使用这个脚本:

function getRangeValues() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange("A2:B4");
  var values = range.getValues();
  return values;
};

这里有工作表: Copy cell values programmatically (72539)

最后:

Add the Current Date to a Sheet When Data Is Added So That The Date Does Not Change(Static) – Google 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());
      }
  }
}

但我不知道如何使它工作。

在B列对应单元格输入数据后,预期结果应该是简单地将序数添加到A列对应单元格。

我们如何做到这一点?

【问题讨论】:

    标签: excel google-apps-script google-sheets excel-formula


    【解决方案1】:

    流程:

    • 使用编辑触发器捕获 Col B 中的事件
    • 在编辑 Col B 时获取所有 Col A
    • 计算 Col A 的最大值并加 1
    • 将最大值设置为 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
      );
    }
    

    阅读和练习:

    【讨论】:

    • 嗨@TheMaster!非常感谢您的想法和参考。我尝试了2天让它工作无济于事!在这里测试和工作完美无瑕:i.imgur.com/s8pXukQ.gifi.imgur.com/EDWkVDE.gif我今天将查阅参考资料,看看我如何使它有意义。顺便说一句,你知道有什么好的在线课程可以让我学得更好吗?再次非常感谢,你摇滚!一切顺利,祝我们一切顺利!
    • @Lod 如果第二个 gif 是为了传达您希望删除 col A,如果删除 colB,那么 this 可能有用。关于在线课程,网上有很多可用的。但是,实践是最重要的。学习直接阅读官方文档并定期练习。
    • 感谢您的阅读建议。我会去的。也感谢新的参考,我只是试图破译田池修改后的脚本,但有很多新术语要理解。我会暂停一个小时左右,然后尝试在新工作表上重现日历问题,看看它是如何工作的。然后,我将尝试从新的理解中删除 Col A 单元格。保重!
    • 您好!我已经测试了调整 Tanaike 的代码以删除 ColA 中的单元格,到目前为止,这是我的结果:i.imgur.com/iLzZu27.gif 它冻结了 ColA nums 但不会删除它。此外,在复制和粘贴时,代码不再起作用:i.imgur.com/g74ZvTI.gif 我已经仔细阅读了 Tanaike 的答案,但看不到解决方法。您还知道如何在 Tanaike 的回答中访问您的 cmets 吗?他们不在那里了。还是在另一个帖子上?
    • 非常感谢您在回答中提供的参考资料,我学习了 .reduce 和 .offset 以及累加器 (acc) 和 currentValue (curr) 的新术语和用法。
    猜你喜欢
    • 2017-02-16
    • 2017-12-04
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多