一次只能使用一次函数,不能两次使用,{un}

时间:2019-05-05 12:30:30

标签: google-apps-script

编辑:固定虚拟数据,感谢您的评论。

我想创建一系列创建电子邮件的功能。我需要删除输入的某些部分,但保留其他部分。

通常的想法是:仅保留名字,从头开始返回字符串,直到空格。但是,如果姓氏的开头有一个“粒子”,则返回带有粒子的字符串,直到下一个空格为止。

有一个正则表达式生成器可以创建一个与名称有趣部分匹配的大正则表达式

第一个代码段启动users()函数。我已经使用了一些硬编码数据,但是应该从Google电子表格中提取。如果我两次使用oneName()函数,则会收到一个错误消息(有关单个用法示例,请参见下一个代码段)

  

无法读取未定义的属性'1'”

users();

function users() {
  var data = [['Jean', 'A Marca'], ['Marie', 'A Marca von Machin'], ['Pierre-Philippe', 'A Marca von machin'], ['Charles-Henri', 'Machin von Truc'], ['Franz Albert', 'All\'Arrabiata von truc'], ['Jérôme', 'all\'arrabiata truc'], ['Heinz', 'n\'Goye'], ['Anne-Méry', 'M\'Bala'], ['Angel', 'Di Maria y Fôdes'], ['Herberto', 'Fôdes y Dos Santos']]
  
  var output = [];
  for(i in data){
    var prenom = oneName(data[i][0])[0];
    console.log(prenom);
    var nom = oneName(data[i][1])[0]
    console.log(nom);
  }
}

function oneName(nom) {
var particules1 = ['de ', 'di ', 'da ', 'dos ', 'von ', 'del\'', 'dell\'', 'della ', 'el ', 'al ', 'd\'', 'do ', 'du ', 'des ', 'de la ', 'a ', 'all\'', 'l\'', 'n\'', 'm\''];
  var particules2 = ['de',  'di',  'da',  'dos',  'von',  'del',   'dell',   'della',  'el',  'al',  'd',   'do',  'du',  'des',  'dela',   'a',  'all' ,  'l',   'n',   'm'];
  
  var regex = new RegExp(regexBuilder(particules1), 'gi');
  return nom.match(regex);
}


function regexBuilder(listeParticules){
  var regex = '';
  for(i in listeParticules){
    if(i == listeParticules.length -1){
      regex = regex + '(^' + listeParticules[i] + '[a-zA-Z\u00c0-\u024f\u1e00-\u1eff]+)|(^[a-zA-Z\u00c0-\u024f\u1e00-\u1eff\']+)';  
    }else{
      regex = regex + '(^' + listeParticules[i] + '[a-zA-Z\u00c0-\u024f\u1e00-\u1eff]+)|';
    }
  }
  return regex;
}

如果我只使用oneName()函数,一切都很好...

users();

function users() {
  var data = [['Jean', 'A Marca'], ['Marie', 'A Marca von Machin'], ['Pierre-Philippe', 'A Marca von machin'], ['Charles-Henri, Machin von Truc'], ['Franz Albert', 'All\'Arrabiata von truc'], ['Jérôme', 'all\'arrabiata truc'], ['Heinz', 'n\'Goye'], ['Anne-Méry', 'M\'Bala'], ['Angel', 'Di Maria y Fôdes'], ['Herberto', 'Fôdes y Dos Santos']]
  
  var output = [];
  for(i in data){
    var prenom = oneName(data[i][0])[0];
    console.log(prenom);
  }
}

function oneName(nom) {
var particules1 = ['de ', 'di ', 'da ', 'dos ', 'von ', 'del\'', 'dell\'', 'della ', 'el ', 'al ', 'd\'', 'do ', 'du ', 'des ', 'de la ', 'a ', 'all\'', 'l\'', 'n\'', 'm\''];
  var particules2 = ['de',  'di',  'da',  'dos',  'von',  'del',   'dell',   'della',  'el',  'al',  'd',   'do',  'du',  'des',  'dela',   'a',  'all' ,  'l',   'n',   'm'];
  
  var regex = new RegExp(regexBuilder(particules1), 'gi');
  return nom.match(regex);
}


function regexBuilder(listeParticules){
  var regex = '';
  for(i in listeParticules){
    if(i == listeParticules.length -1){
      regex = regex + '(^' + listeParticules[i] + '[a-zA-Z\u00c0-\u024f\u1e00-\u1eff]+)|(^[a-zA-Z\u00c0-\u024f\u1e00-\u1eff\']+)';  
    }else{
      regex = regex + '(^' + listeParticules[i] + '[a-zA-Z\u00c0-\u024f\u1e00-\u1eff]+)|';
    }
  }
  return regex;
}

我还有一个问题:如果我只使用一次oneName()函数,但是我想用它来提取姓氏,那么它可以使用前三个名字,但是会得到“ undefined” ”。这个问题与正则表达式有一定关系,我将尝试分别对其进行故障排除。

那么,为什么我不能两次使用此功能?

1 个答案:

答案 0 :(得分:1)

我认为Diego's comment是重要的修改点之一。

作为另一个修改点,在您的脚本中,运行var prenom = oneName(data[i][0])[0]后,data[i]变为undefined,因为i中的for(i in data){}被用作全局变量。运行var prenom = oneName(data[i][0])[0];之后,i的值将在regexBuilder()的功能中更改。由此,我认为错误发生了。

为了避免此错误,该修改如何?在此修改中,for(i in data){被修改为for(var i in data){。请认为这只是几个答案中的两个。

修改后的脚本:

users();

function users() {
  var data = [['Jean', 'A Marca'], ['Marie', 'A Marca von Machin'], ['Pierre-Philippe', 'A Marca von machin'], ['Charles-Henri', 'Machin von Truc'], ['Franz Albert', 'All\'Arrabiata von truc'], ['Jérôme', 'all\'arrabiata truc'], ['Heinz', 'n\'Goye'], ['Anne-Méry', 'M\'Bala'], ['Angel', 'Di Maria y Fôdes'], ['Herberto', 'Fôdes y Dos Santos']]
  
  var output = [];
  for (var i in data) { // or for (var i = 0; i < data.length; i++) { // <--- Modified
    var prenom = oneName(data[i][0])[0];
    console.log(prenom);
    var nom = oneName(data[i][1])[0];
    console.log(nom);
  }
}

function oneName(nom) {
  var particules1 = ['de ', 'di ', 'da ', 'dos ', 'von ', 'del\'', 'dell\'', 'della ', 'el ', 'al ', 'd\'', 'do ', 'du ', 'des ', 'de la ', 'a ', 'all\'', 'l\'', 'n\'', 'm\''];
  var particules2 = ['de',  'di',  'da',  'dos',  'von',  'del',   'dell',   'della',  'el',  'al',  'd',   'do',  'du',  'des',  'dela',   'a',  'all' ,  'l',   'n',   'm'];
  var regex = new RegExp(regexBuilder(particules1), 'gi');
  return nom.match(regex);
}

function regexBuilder(listeParticules) {
  var regex = '';
  for(var i in listeParticules){ // Modified
    if(i == listeParticules.length -1){
      regex = regex + '(^' + listeParticules[i] + '[a-zA-Z\u00c0-\u024f\u1e00-\u1eff]+)|(^[a-zA-Z\u00c0-\u024f\u1e00-\u1eff\']+)';  
    }else{
      regex = regex + '(^' + listeParticules[i] + '[a-zA-Z\u00c0-\u024f\u1e00-\u1eff]+)|';
    }
  }
  return regex;
}

如果我误解了您的问题,而这不是您想要的结果,我深表歉意。