我获得了一个要添加到电子表格中的自定义函数。 我正在构建,但它并不能完全满足我现在需要它做的事情。我对 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;
}
}
我知道我需要复制然后调整性别部分,但我不知道需要调整哪些部分以及如何调整。
下面是基于使用正则表达式而不是
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;
}