如何使用 GAS 根据范围内的单词出现次数增加 2 个字母的集合?

How to increment set of 2 letters based on word occurrences in the range using GAS?

我得到了这个看起来很毛茸茸的,但我相信你们可以在玩得开心的同时破解它。

问题:

  1. 检查公司存在于
  2. 范围内
  3. 如果不是,获取最新的ID前缀,类似AAAB
  4. 根据上面的项目生成一个新的前缀,如下所示:AC
  5. 如果该公司多次出现,则增加 ID 号后缀 ​​XX001XX002

这是我到目前为止的想法:

function generateID() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const clientSheet = ss.getSheetByName('Clients');
  const dataRng = clientSheet.getRange(8, 1, clientSheet.getLastRow(), clientSheet.getLastColumn());
  const values = dataRng.getValues();

  const companies = values.map(e => e[0]);//Gets the company for counting

  for (let a = 0; a < values.length; a++) {
    let company = values[a][0];

    //Counts the number of occurrences of that company in the range 
    var companyOccurrences = companies.reduce(function (a, b) {
      return a + (b == company ? 1 : 0);
    }, 0);

    if (companyOccurrences > 1) {
      let clientIdPrefix = values[a][2].substring(0, 2);//Gets the first 2 letters of the existing company's ID

    } else {
      //Generate ID prefix, incrementing on the existing ID Prefixes ('AA', 'AB', 'AC'...);
      let clientIdPrefix = incrementChar(values[a][2].substring(0,1));
      Logger.log('Incremented Prefixes: ' + clientIdPrefix)
    }
  }
}

//Increment passed letter
var alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('')
function incrementChar(c) {
    var index = alphabet.indexOf(c)
    if (index == -1) return -1 // or whatever error value you want
    return alphabet[index + 1 % alphabet.length]
}

...这是从 tckmn's 答案中借用的,它只处理一个字母。

这是预期的结果:

这是 link 到 file,如果有人想试一试的话。

谢谢!

你的情况,下面的修改怎么样?

修改后的脚本:

// Please run this function.
function generateID() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Clients');
  const dataRng = sheet.getRange(8, 1, sheet.getLastRow() - 7, 1);
  const values = dataRng.getValues();
  let temp = "";
  let init = "";
  let count = 0;
  const res = values.map(([a], i) => {
    count++;
    if (temp != a) {
      count = 1;
      temp = a;
      init = i == 0 ? "AA" : wrapper(init);
    }
    return [`${init}${count.toString().padStart(3, "0")}`];
  });
  console.log(res)
  sheet.getRange(8, 4, res.length, 1).setValues(res);
}

//Increment
var alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('')
function incrementChar(c) {
  var index = alphabet.indexOf(c)
  if (index == -1) return -1 // or whatever error value you want
  return alphabet[index + 1 % alphabet.length]
}

// I added this function.
function wrapper(str) {
  const [a, b] = [...str];
  const r1 = incrementChar(a);
  const r2 = incrementChar(b);
  return (r2 ? [a, r2] : (r1 ? [r1, "A"] : ["over"])).join("");
}
  • 在这次修改中,我添加了一个包装函数。此包装函数使用您的 incrementChar.
  • 显示脚本
  • 当此脚本是 运行 您的示例电子表格时,console.log(res) 显示 [["AA001"],["AA002"],["AA003"],["AA004"],["AA005"],["AB001"],["AB002"],["AB003"],["AC001"]]。并将此值放入“D”列。

注:

  • 此修改后的示例适用于您提供的电子表格。所以请注意这一点。

参考: