复制此部分代码以添加另一个变量后,我需要调整该部分代码的哪些元素?

问题描述 投票:0回答:1

我获得了一个要添加到电子表格中的自定义函数。 我正在构建,但它并不能完全满足我现在需要它做的事情。我对 JavaScript 有基本的了解,但由于我没有编写这段代码,所以我在解析哪些部分的作用时遇到了一些困难。

目前,该函数从我选择的范围中获取值,用逗号分隔所有值,并将所有结果值放在第二个选项卡上。例如,它采用

ValueA (ValueB)
表示姓名和性别,并将数据放入第二个选项卡上的 A2 和 B2 中。我希望添加到该函数中,以便可以将
ValueA (ValueB, ValueC)
添加到第二个选项卡上的 A2、B2 和 C2。

function getAuthorList(range) {
 
 if (range.map) {
 
   var count = 0;
   var field = '';
   var author = '';
 
   var authors = [];
 
   for(var i = 0; i < range.length; i++ ){
 
     field = range[i][0];
   
     var pos = 0, posNext = 0;
   
     while( field.length > 0 ){
   
       if( field.indexOf(',') > 0 ){
         
         posNext = field.indexOf(',');
         author = field.substring( pos, posNext );
         field = field.substring( posNext + 1 , field.length );
       
       } else {
     
         posNext = field.length;
         author = field.substring( pos, posNext );
         field = field.substring( posNext, field.length );
     
       }
     
       var start = author.indexOf('(');
       var end = author.indexOf(')');
     
       var name = '';
     
       if( start > 0 ){
     
         name = author.substring(0, start - 1);
       
         if( name.indexOf(' ') == 0 ){
           name = name.substring(1, name.length );
         }
       
       } else {
     
         name = author;
     
       }
     
       var gender = '';
       if( start > 0 && end > 0 ){
         gender = author.substring(start + 1, end);
       }
     
       authors.push([ name, gender]);
   
     }
   
   }
 
   if( authors.length < 1 ){
     return "";
   }
 
   return authors;
 
 }
 
}

我知道我需要复制然后调整性别部分,但我不知道需要调整哪些部分以及如何调整。

javascript google-sheets google-apps-script google-sheets-formula custom-function
1个回答
0
投票

下面是基于使用正则表达式而不是

String.prototype.indexOf
String.prototype.substring
的提案。 test_1和test_2是使用多个单元(A1:A2)和单个单元(A1)进行测试的测试函数。请记住,这是一个自定义函数,旨在用于 Google 表格公式
=getAuthorList(A1:A2)
=getAuthorList(A1)

输入值示例

A
1 加西亚·马尔克斯(中篇小说)
2 奥克塔维奥·帕斯(Ensayo、Poesía)
/**
 * Multiple cells
 * Expected result: string[][]
 */
function test_1() {
  const name = 'Sheet1';
  const a1Notation = 'A1:A2';
  // Expected values [["García Márquez (Novela)"], ["Octavio Paz (Ensayo, Poesía)"]];
  const values = SpreadsheetApp
    .getActiveSpreadsheet()
    .getSheetByName(name)
    .getRange(a1Notation)
    .getValues();
  const result = getAuthorList(values);
  Logger.log(result);
}

/**
 * Single cell
 * Expected result: string[][]
 */
function test_2() {
  const name = 'Sheet1';
  const a1Notation = 'A1';
  // Expected value "García Márquez (Novela)"
  const value = SpreadsheetApp
    .getActiveSpreadsheet()
    .getSheetByName(name)
    .getRange(a1Notation)
    .getValue();
  const result = getAuthorList(value);
  Logger.log(result);
}

/** type {string[]|string[][]} */
const authorList = [];

/**
 * @customfunction
 */
function getAuthorList(value) {  

  if (value.map) {

    // Split row values
    value.flat().forEach(v => getAuthorList(v));

    // Get the max number of elements by row
    const columns = authorList.reduce((n, row) => Math.max(n, row.length), 0);

    // Add empty strings to make a square matrix;
    authorList.forEach(row => { for (i = 0; i < columns - row.length; i++) { row.push('') } });

  } else {

    const result = /([^()]+)\(([^()]+,?[^)]*)\)?/.exec(value);
    result.shift();
    authorList.push([result[0], ...result[1].split(',')]);
  
  }
  
  return authorList;

}
© www.soinside.com 2019 - 2024. All rights reserved.