Google apps script 粘贴多行并为其生成ID

Google apps script 粘贴多行并为其生成ID,google-apps-script,google-sheets,triggers,Google Apps Script,Google Sheets,Triggers,我正在使用一个创建唯一ID的代码。我面临的问题是,当我检索一个包含10行的列表并将其粘贴到B列时,代码只为第一行生成ID。因此,为了生成ID,我必须逐行复制/粘贴 有没有一种方法可以修改代码,使其能够一次为多行生成ID /* ***Custom Unique ID*** * * onEdit of the selected new cell, Custom Unique ID: * 1. Sorts through the ID column * 2. Finds the large

我正在使用一个创建唯一ID的代码。我面临的问题是,当我检索一个包含10行的列表并将其粘贴到B列时,代码只为第一行生成ID。因此,为了生成ID,我必须逐行复制/粘贴 有没有一种方法可以修改代码,使其能够一次为多行生成ID

/* ***Custom Unique ID***
 *
 * onEdit of the selected new cell, Custom Unique ID:
 *  1. Sorts through the ID column
 *  2. Finds the largest value
 *  3. Adds 1 to this value and inserts this at the next unique ID.
 *
 * The ID column must have at least 1 Unique ID for the program to reference.
 *
 * Custom Unique ID can take ID's with:
 *  -Leading letters
 *  -Leading Zeroes
 *  -Trailing Letters
 *
 * -Trailing and leading letters must be of the same length.
 * -Letters cannnot be between numbers. For example, ARG00123B025AG.
 * -ID must be of same length. e.g. FE100er has a length of 7 characters. Subsequent 
 *  IDs must be of the same length. Ensure you have sufficient leading zeroes e.g. KRG0002345
 *
 * Custom Unique ID Can take multiple sheet and cell locations. See "var locations".
 * Unique ID's won't be deleted when other cell data is changed or edited. 
 */

// Location format = [sheet, ID Column, ID Column Row Start, Edit Column]
var locations = [
  ["Liste",3,2,2],
];

function onEdit(e){
  // Set a comment on the edited cell to indicate when it was changed.
  //Entry data
  var range = e.range;
  var col = range.getColumn();
  var row = range.getRow();

  // Location Data
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();

  function getNewID(){
    function IDrange(){
      var dataRange = sheet.getDataRange();
      var lastRow = dataRange.getLastRow();

      return sheet.getRange(IDrowStart,IDcol,lastRow-IDrowStart).getValues();
    };

    //Get largest Value in range
    function getLastID(range){
      var sorted = range.sort();
      var lastIDval = sorted[sorted.length-1][0];

      return lastIDval;

    };
    //Stores leading letters and zeroes and trailing letters
    function getLettersNzeroes(id){

      //Get any letters or zeroes.
      var re = new RegExp("^([a-zA-Z0])$");
      var letterZero = [];
      for(char = 0; char < id.length; char++){
        if(re.test(id[char])){
          letterZero.push([char,id[char]]);// [[position, letter or zero]]
        };
      };

      // Categorize letters and zeroes into start and end blocks
      var startLetterZero = "", 
          endLetter = "",
          len = letterZero.length - 1;
      for(j = 0; j < letterZero.length; j++){
        if(letterZero[j][0] === j){
          startLetterZero += letterZero[j][1];
        }else if(letterZero[j][1] !== "0" && letterZero[len][0] - (len - j) == letterZero[j][0]){
          endLetter += letterZero[j][1];
        };
      };
      var startNend = {"start":startLetterZero,"end":endLetter};

      return startNend;
    };

    //Gets last id number. Adds 1 an checks to set if its  new length is greater than the lastNumber.
    function getNewNumber(id){
      var removeZero = false;

      var lastNum = parseInt(id.replace(/\D/g,''),10);//Remove letters
      var newNum = (lastNum+1).toString();

      if(lastNum.toString().length !== newNum.length){
        var removeZero = true;
      };
      var newNumSet = {"num":newNum, "removeZero": removeZero};

      return newNumSet
    };

    var lastID = getLastID(IDrange());
    var lettersNzeroes = getLettersNzeroes(lastID);
    var newNumber = getNewNumber(lastID);

    //If the number is 9,99,999,9999 etc we need to remove a zero if it exists.
    if(newNumber.removeZero === true && lettersNzeroes.start.indexOf("0")  !== -1.0){
      lettersNzeroes.start = lettersNzeroes.start.slice(0,-1);
    };

    //Rejoin everything together
    var newID = lettersNzeroes.start +
                newNumber.num +
                lettersNzeroes.end;

    return newID;  
  };

  for(i = 0; i < locations.length; i++){
    var sheetID = locations[i][0],
        IDcol   = locations[i][1],
        IDrowStart = locations[i][2],
        EditCol = locations[i][3];

    var offset = IDcol - EditCol;
    var cell = sheet.getActiveCell();

    if(sheetID === sheet.getName()){
      if(EditCol === col){
        //ID Already Exists the editing cell isn't blank.
        if(cell.offset(0,offset).isBlank() && cell.isBlank() === false){
          var newID = getNewID();
          cell.offset(0,offset).setValue(newID);
        };
      };
    }; 
  };        
};
/****自定义唯一ID***
*
*所选新单元格的OneEdit,自定义唯一ID:
*  1. 通过ID列进行排序
*  2. 查找最大值
*  3. 将1添加到此值,并在下一个唯一ID处插入此值。
*
*ID列必须至少有一个唯一ID供程序引用。
*
*自定义唯一ID可以使用以下ID获取ID:
*-前导字母
*-前导零
*-尾随字母
*
*-尾随字母和前导字母的长度必须相同。
*-字母不能在数字之间。例如,ARG00123B025AG。
*-ID必须具有相同的长度。e、 g.FE100er的长度为7个字符。后来的
*ID必须具有相同的长度。确保有足够的前导零,例如KRG0002345
*
*自定义唯一ID可以采用多个图纸和单元格位置。请参阅“var位置”。
*更改或编辑其他单元格数据时,不会删除唯一ID。
*/
//位置格式=[工作表,ID列,ID列行开始,编辑列]
变量位置=[
[“李斯特”,3,2,2],
];
功能OneEdit(e){
//在编辑的单元格上设置注释,以指示更改的时间。
//输入数据
var范围=e范围;
var col=range.getColumn();
var row=range.getRow();
//位置数据
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet=ss.getActiveSheet();
函数getNewID(){
函数IDrange(){
var dataRange=sheet.getDataRange();
var lastRow=dataRange.getLastRow();
return sheet.getRange(IDrowStart、IDcol、lastRow IDrowStart).getValues();
};
//获取范围内的最大值
函数getLastID(范围){
var sorted=range.sort();
var lastIDval=sorted[sorted.length-1][0];
返回lastIDval;
};
//存储前导字母、零和尾随字母
函数getLettersNzeroes(id){
//获取任何字母或零。
var re=新的RegExp(“^([a-zA-Z0])$”;
var letterZero=[];
for(char=0;char
解决方案 为了实现您的目标,您将需要一个For循环,在该循环中,您可以设置只需单独粘贴的列的每一行
e.range
将返回更改的单元格的整个范围,可以是一个或多个单元格

因此,仅在最后阶段设置独立单元格(没有for循环)是不够的,因为它将仅设置粘贴范围的第一个单元格,或者使用相同的值设置所有单元格

要解决此问题,请更改脚本的这一部分:

var offset=IDcol-EditCol;
var cell=sheet.getActiveCell();
如果(sheetID==sheet.getName()){
如果(编辑列===列){
//ID已存在编辑单元格不是空的。
if(cell.offset(0,offset).isBlank()&&cell.isBlank()==false){
var newID=getNewID();
cell.offset(0,offset).setValue(newID);

}
简短回答:是的,有。你已经理解你问题中包含的代码了吗?你在这里所做的真是太棒了!非常感谢你的帮助。