Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.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
Google apps script 在Google工作表中自动生成唯一的顺序ID_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 在Google工作表中自动生成唯一的顺序ID

Google apps script 在Google工作表中自动生成唯一的顺序ID,google-apps-script,google-sheets,Google Apps Script,Google Sheets,在GoogleSheets中,我有一个名为Events/Incents的电子表格,来自各个分支机构的员工都会填写该表格。我希望B列根据a列中的年份和之前填充的事件自动生成唯一ID。考虑到某一天可能有多个事件,列a中的行可能有重复的日期 以下是我在B栏中寻找的示例: 不可能有重复的。非常感谢您对代码或公式的帮助。这是我的想法 主函数得到一张表,并制作魔术 /** * * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet */ functio

在GoogleSheets中,我有一个名为Events/Incents的电子表格,来自各个分支机构的员工都会填写该表格。我希望B列根据a列中的年份和之前填充的事件自动生成唯一ID。考虑到某一天可能有多个事件,列a中的行可能有重复的日期

以下是我在B栏中寻找的示例:

不可能有重复的。非常感谢您对代码或公式的帮助。

这是我的想法

主函数得到一张表,并制作魔术

/**
 *
 * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet
 */
function autoid_(sheet) {
  var data = sheet.getDataRange().getValues();
  if (data.length < 2) return;
  var indexId = data[0].indexOf('ID');
  var indexDate = data[0].indexOf('DATE');
  if (indexId < 0 || indexDate < 0) return;
  var id = data.reduce(
    function(p, row) {
      var year =
        row[indexDate] && row[indexDate].getTime
          ? row[indexDate].getFullYear() % 100
          : '-';
      if (!Object.prototype.hasOwnProperty.call(p.indexByGroup, year)) {
        p.indexByGroup[year] = [];
      }
      var match = ('' + row[indexId]).match(/(\d+)-(\d+)/);
      var idVal = row[indexId];
      if (match && match.length > 1) {
        idVal = match[2];
        p.indexByGroup[year].push(+idVal);
      }
      p.ids.push(idVal);
      p.years.push(year);
      return p;
    },
    { indexByGroup: {}, ids: [], years: [] }
  );

  // Logger.log(JSON.stringify(id, null, '  '));

  var newId = data
    .map(function(row, i) {
      if (row[indexId] !== '') return [row[indexId]];
      if (isNumeric(id.years[i])) {
        var lastId = Math.max.apply(
          null,
          id.indexByGroup[id.years[i]].filter(function(e) {
            return isNumeric(e);
          })
        );
        lastId = lastId === -Infinity ? 1 : lastId + 1;
        id.indexByGroup[id.years[i]].push(lastId);
        return [
          Utilities.formatString(
            '%s-%s',
            id.years[i],
            ('000000000' + lastId).slice(-3)
          )
        ];
      }
      return [''];
    })
    .slice(1);
  sheet.getRange(2, indexId + 1, newId.length).setValues(newId);
}
/**
*
*@param{GoogleAppsScript.Spreadsheet.Sheet}Sheet
*/
函数自动标识(工作表){
var data=sheet.getDataRange().getValues();
if(data.length<2)返回;
var indexId=data[0]。indexOf('ID');
var indexDate=data[0]。indexOf('DATE');
如果(indexId<0 | | indexDate<0)返回;
var id=data.reduce(
功能(p,世界其他地区){
风险年=
行[indexDate]&行[indexDate].getTime
?行[indexDate].getFullYear()%100
: '-';
if(!Object.prototype.hasOwnProperty.call(p.indexByGroup,year)){
p、 indexByGroup[年度]=[];
}
变量匹配=(''+行[indexId])。匹配(/(\d+)-(\d+)/);
var idVal=行[indexId];
如果(匹配(&match.length>1){
idVal=匹配[2];
p、 索引组[年]。推送(+idVal);
}
p、 id.push(idVal);
p、 年。推(年);
返回p;
},
{indexByGroup:{},id:[],years:[]}
);
//Logger.log(JSON.stringify(id,null,');
var newId=数据
.map(功能(第一行){
if(row[indexId]!=''返回[row[indexId]];
如果(是数字(id.years[i])){
var lastId=Math.max.apply(
无效的
id.indexByGroup[id.years[i]]过滤器(函数(e){
返回数字(e);
})
);
lastId=lastId===-无穷大?1:lastId+1;
id.indexByGroup[id.years[i].push(lastId);
返回[
实用程序.formatString(
“%s-%s”,
id.年[i],
('000000000'+lastId).slice(-3)
)
];
}
返回[''];
})
.切片(1);
sheet.getRange(2,indexId+1,newId.length).setValues(newId);
}


我认为它可以在功能中简化。

有一种更简单的方法可以生成适合我的唯一值,选择一个#,然后执行+1。按住Ctrl键C,然后按住Ctrl键shift键V以粘贴并删除公式。现在,您只剩下数千个唯一的ID


这是一个手动解决方案,但您可以每隔一段时间在几秒钟内完成整个数据库。

为什么不使用公式?columnA中的每一行是否总是有不同的日期?@contributorpw-很高兴它是一个formula@Cooper-不,日期可能与某一天可能发生多起事件的日期相同。我现在修改了回答以上问题。@contributorpw-看起来很完美-正是我想要的。你花了很多时间和精力。非常感谢你。我已经有一个应用程序脚本影响同一工作表中的相邻列。我将您的代码复制到另一个选项卡中,但它停止了其他代码的功能,并且您的代码不起作用。如何在不影响其他代码的情况下将代码添加到脚本编辑器中?@McChief您需要只使用一个
onEdit
函数。将所有编辑事件函数放在那里。把这张纸给我ai@contributor.pwReally干得好。这很好用-谢谢你的时间和努力-这是头等舱