Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 要为添加的时间创建时间戳,并创建唯一的增量用户ID。还包括上次更改的列_Javascript_Events_Google Apps Script_Google Sheets_Timestamp - Fatal编程技术网

Javascript 要为添加的时间创建时间戳,并创建唯一的增量用户ID。还包括上次更改的列

Javascript 要为添加的时间创建时间戳,并创建唯一的增量用户ID。还包括上次更改的列,javascript,events,google-apps-script,google-sheets,timestamp,Javascript,Events,Google Apps Script,Google Sheets,Timestamp,我正在使用Google Sheets来创建一个(最初计划的)快速简便的数据库。用户提交一个表单,然后将其发送到一个表单存储 我尝试通过Google Apps脚本自动更新三个专栏: “用户ID”(应在添加新行时自动创建,且不能更改) “createdAt”列,它只是添加行时的时间戳 “lastChanged”列,表示上一次更改行的时间 我使用了和的建议,但我仍然有问题 我现在正在一个onEdit事件上运行它。但“lastChanged”列似乎是该事件应触发的唯一列,其他列应与类似于changeTy

我正在使用Google Sheets来创建一个(最初计划的)快速简便的数据库。用户提交一个表单,然后将其发送到一个表单存储

我尝试通过Google Apps脚本自动更新三个专栏:

  • “用户ID”(应在添加新行时自动创建,且不能更改)
  • “createdAt”列,它只是添加行时的时间戳
  • “lastChanged”列,表示上一次更改行的时间
  • 我使用了和的建议,但我仍然有问题

    我现在正在一个onEdit事件上运行它。但“lastChanged”列似乎是该事件应触发的唯一列,其他列应与类似于
    changeType=='INSERT\u ROW'
    的内容一起使用。提交用户详细信息时(通过Zapier),会添加一行,因此onEdit无法设置userId和createdAt

    我还知道,我生成用户ID的方法远远不够理想

    到目前为止,我已经做到了这一点

    function onEdit(e) {
    
    var userId = 1 // column A  
    var createdTime = 2 //column B
    var lastChangedTime = 24 //column X
    
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = e.source.getSheets()[1]; //gets the second sheet
    var editedCell = sheet.getActiveCell(); //gets the edited cell
    
    var Avals = ss.getRange("A2:A").getValues();
    var Alast = Avals.filter(String).length;
    
    //set date in same row as edit happens, at fixed column  
    ss.getActiveSheet().getRange(ss.getActiveRange().getLastRow(), lastChangedTime, 1, 1).setValue(new Date());
    
    //set the created time
    ss.getActiveSheet().getRange(ss.getActiveRange().getLastRow(), createdTime, 1, 1).setValue(new Date());
    //set the userID
    ss.getActiveSheet().getRange(ss.getActiveRange().getLastRow(), userId, 1, 1).setValue(Alast+1); }  
    

    更新从原来的海报在这里-我有一个解决方案,这不是最优雅的,但服务于我的目的。欢迎批评和建议:)

    现在来找出通过气体插入动态公式的最佳方法

    function onChange(e) {
    
    var userId = 1 // column A  
    var createdTime = 2 //column B
    var lastChangedTime = 24 //column X
    
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = e.source.getSheets()[1]; //gets the second sheet
    
    var Avals = ss.getRange("A2:A").getValues(); //gets all the values of column A 
    var Alast = Avals.filter(String).length; //puts all values in a string and gets the length
    
    var now = new Date();
    
    if (e.changeType == "INSERT_ROW") {
    
    //set the created time
    ss.getActiveSheet().getRange(ss.getActiveRange().getLastRow(), createdTime, 1, 1).setValue(new Date());
    //set the userID
    ss.getActiveSheet().getRange(ss.getActiveRange().getLastRow(), userId, 1, 1).setValue(Alast+1);
    
    //set lastChangedTime when the row is created 
    ss.getActiveSheet().getRange(ss.getActiveRange().getLastRow(), lastChangedTime, 1, 1).setValue(now);
       } 
    
      if (e.changeType == "EDIT") {
    
    //set date in same row as edit happens, at fixed column  
    ss.getActiveSheet().getRange(ss.getActiveRange().getLastRow(), lastChangedTime, 1, 1).setValue(new Date());
    
       }  
    }
    

    您可以分享您的解决方案,但这类帖子应该描述应用的解决方案是如何工作的/为什么工作的。@Rubén当我意识到onEdit()不是管理此问题的最有效方法时,它就工作了,而不是onChange(然后指定脚本所寻找的文档的不同类型的更改)更好地达到目的。现在,这种方式允许它根据是否添加了行或仅编辑了单元格来执行不同的操作。答案中应包含解释。评论是临时性的:)