很抱歉再次打扰您,我要疯了。。我只想过滤范围内每个单元格中的唯一字符串(字符串用分号分隔(我不能推送所有的数组值,只有一个是结果。非常感谢!
以下是一个示例:https://docs.google.com/spreadsheets/d/12T5K9LovcFvmeBg82IS89p4ygtZ530mzpY9fIsZQa8w/edit?usp=sharingPS:我使用脚本是因为每个单元格中有太多字符串,无法通过公式拆分单元格
这是我的编码:
function FilterReferences(){
var classeur = SpreadsheetApp.getActive();
var feuille = classeur.getSheetByName('Feuille 1');
var plage = feuille.getRange('A1:A');
var plageValues = plage.getValues();
var NbLignesTotal = plage.getLastRow();
for (var i = 1; i < NbLignesTotal; i++){
try {
var valeurCellule = plageValues[i-1][0];
if (valeurCellule != ""){
var source = valeurCellule.split(";");
var dest = [];
dest.push(source[0]);
for (var n = 0 ; n < source.length ; n++){
if (dest.indexOf(source[n]) == -1){ dest.push(source[n])}; }
var plageDest = feuille.getRange('B1:B');
plageDest.getCell(i,1).setValue([dest]);
}
} catch (e) { }
}
}
- 您想要实现以下情况。每个值都放在一个单元格中。
AAA;BBB;AAA;BBB;CCC
到AAA;BBB;CCC
AAA;CCC;AAA;DDD;ZZZ;CCC
至AAA;CCC;DDD;ZZZ
模式1:
在这种模式中,您的脚本会被修改。
修改的脚本:
请修改如下。
发件人:plageDest.getCell(i,1).setValue([dest]);
收件人:plageDest.getCell(i + 1, 1).setValue(dest.join(";"));
- 在脚本中,
dest
是一个数组。因此,为了将其转换为字符串,使用了join
。- 运行
plageDest.getCell(i,1).setValue([dest]);
时,第一个元素由setValue
放置。我认为这就是你问题的原因
- 运行
- 为了放置第2行的值,使用
i + 1
而不是i
模式2:
在这种模式中,通过降低处理成本来修改脚本。
修改的脚本:
function FilterReferences() {
var classeur = SpreadsheetApp.getActive();
var feuille = classeur.getSheetByName('Feuille 1');
var plage = feuille.getRange('A2:A' + feuille.getLastRow()); // Modified
var plageValues = plage.getValues();
// I added below script.
const res = plageValues.map(([e]) =>
[Object.keys(e.split(";").reduce((o, e) =>
Object.assign(o, {[e]: null})
, {})).join(";")]
);
feuille.getRange(2, 2, res.length, 1).setValues(res);
}
- 在这个脚本中,值是在循环中创建的。然后,使用
setValues
将创建的值放入单元格
参考文献:
- join((
- setValue(value(
- setValues(值(