仅当添加新行时,使用Utilities.formatString()的唯一标识符脚本

时间:2015-01-15 11:10:29

标签: google-sheets

我试图在A列中实现唯一标识符。为此,我倾向于此处讨论的解决方案:Auto incrementing Job Reference(使用Utilities.formatString() Google表格。

为了便于阅读,这是我当前的脚本(我对原始脚本进行了一些细微的修改):

function Identifier(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getSheetByName("Epics");
var startcell = sh.getRange('A2').getValue();
var colValues = sh.getRange('A2:A').getValues();// get all the values in column A in an array
var max=0;// define the max variable to a minimal value
  for(var r in colValues){ // iterate the array
    var vv=colValues[r][0].toString().replace(/[^0-9]/g,'');// remove the letters from the string to convert to number
    if(Number(vv)>max){max=vv};// get the highest numeric value in the column, no matter what happens in the column... this runs at array level so it is very fast
    }
    max++ ; // increment to be 1 above max value
sh.getRange(sh.getLastRow(), 1).setValue(Utilities.formatString('E%04d',max));// and write it back to sheet's last row.
}

原始功能旨在使用触发器'在表单提交'但是我只需要在我的工作表中添加新行时触发此逻辑。触发'开启编辑'因为这样,每次对工作表的更改都会导致最后一个ID被下一个新ID覆盖。

如何在Googlesheet中添加新行时确保只调用我的函数?

编辑[2015年1月20日] 与此同时,我在某种程度上改编了剧本:

function Identifier(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getSheetByName("Epics");
var r = ss.getActiveRange();
var editRow = parseInt(r.getRow()); // get the row the edit happend on 
var lastRow = ss.getLastRow();
var startcell = sh.getRange('A2').getValue();
var colValues = sh.getRange('A2:A').getValues();// get all the values in column A in an array
var max=0;// define the max variable to a minimal value
    if(lastRow == editRow){
        for(var r in colValues){ // iterate the array
        var vv=colValues[r][0].toString().replace(/[^0-9]/g,'');// remove the letters from the string to convert to number
        if(Number(vv)>max){max=vv};// get the highest numeric value in the column, no matter what happens in the column... this runs at array level so it is very fast
        }
    max++ ; // increment to be 1 above max value
    sh.getRange(sh.getLastRow(), 1).setValue(Utilities.formatString('E%04d',max));// and write it back to sheet's last row.
    }
}

这几乎按预期工作。还是要解决:

  • 使用上面的脚本,最后的ID字段会随着每次更新到工作表的最后一行而更新。我需要修改上面的脚本,以便最后一行的更新不会产生新的ID。 (必须)

  • 在现有范围中插入新行时,脚本当前无法识别此行。 (很高兴)

1 个答案:

答案 0 :(得分:0)

我一直在研究这些方面的内容,我可以帮助你解决部分问题。您可以创建已安装的触发器,并在插入行时使用OnChange事件来触发。

function myFunction(event){
  if(event.changeType=='INSERT_ROW'){
    // do Something
  }
}

我仍在尝试找到获取插入行位置的答案。