我需要连接每个项目的x列数,有时它是3列其他7或5,它只是取决于
我正在尝试使用一系列范围列号ex [2,5,3]
列2,5 3按此顺序,在此处使用分隔符|
我搜索过但发现只有静态连接函数
我有一个VBA宏,可以在Excel中使用,因此我尝试在Google Script中编写它
该函数运行时没有错误,但没有回发任何内容 从Logger.log()我有点接近正确的结构
我得到undefined|b|e|c
我想回到最后一栏+ 1
我不确定这是做到这一点的最好方法,但它是我拥有的 感谢任何帮助,谢谢
colA ColB ColC ColD ColE ColF ColG ColH
a b cc d e f g b|e|c
a2 b2 d2 e2 f2 g2 e2|c2
ect.
这就是我所拥有的:
function TemplateA_n() {
Template_A("A", [2, 4, 6])
}
function Template_A(SshtName, sArr){
var sSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SshtName);
var sR = sSheet.getDataRange();
var sV = sR.getValues();
var sLC = sSheet.getLastColumn();
var sLR = sSheet.getLastRow();
var a = []
//Rows
for (var row = 2; row < sLR; row++){
a[row] =[]
//Columns
for (var col = 0; col < sArr.length ; col++){
if(sV[row][sArr[col]] !== "") {
if(sV[row][sArr[0]] == "") {
a[row][0] = a[row][0] + sV[row][sArr[col]];
Logger.log(a[row][0])
}
else {
a[row][0] = a[row][0] + "|" + sV[row][sArr[col]];
Logger.log(a[row][0])
}
}
}
}
sSheet.getRange(1,sLC + 1,sLR,1);
}
这是宏
Sub ConCatA()
Dim rng As Range, r As Range, i As Long
On Error Resume Next
Set rng = Application.InputBox("Select column(s)", Type:=8)
'Set rng = Range("B1,A1,C1")
On Error GoTo 0
If rng Is Nothing Then Exit Sub
With ActiveSheet.UsedRange
ReDim a(1 To .Rows.Count, 1 To 1)
a(1, 1) = "Concat"
For i = 2 To .Rows.Count
For Each r In rng
If .Cells(i, r.Column) <> "" Then
a(i, 1) = a(i, 1) & IIf(a(i, 1) = "", "", "|") & .Cells(i, r.Column).value
End If
Next r
Next i
With .Offset(, .Columns.Count).Resize(, 1)
.value = a
End With
End With
End Sub
答案 0 :(得分:1)
第1部分:输出中的未定义值
您获得以下输出的原因:undefined|b|e|c
是因为在为其赋值之前未定义变量a[row][0]
。因此,当程序在循环中第一次运行以下代码行时,它会将sV[row][sArr[col]]
的值连接到undefined。
a[row][0] = a[row][0] + sV[row][sArr[col]]
您需要做的就是首先指定一个空值,如此
for (var row = 2; row < sLR; row++){
a[row] =[]
a[row][0] = ""
... your code here
}
此外,由于值的赋值仅从循环中的索引2开始,我们需要分配索引0和1.
a[0] = [""]
a[1] = [""]
当我们对此数组使用setvalues函数时,这将使我们能够在工作表中输入空白值
第2部分:将值附加到工作表(lastColumn + 1)
您定义要附加数据的范围,然后设置其值,如下所示:
var appRange = Sheet.getRange(2,sLC+1,a.length,1)
appRange.setValues(a)
您的最终代码如下所示:
function Template_A(SshtName, sArr){
var sSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SshtName);
var sR = sSheet.getDataRange();
var sV = sR.getValues();
var sLC = sSheet.getLastColumn();
var sLR = sSheet.getLastRow();
var a = []
//Rows
a[0]= [""] // Since you are start from index 1, you need to assign a value to index 0
for (var row = 1; row < sLR; row++){ //If you intended to start from 2nd row
// var row = 1 and not 2
a[row] = []
a[row][0] = "" //Empty value for each row
//Columns
for (var col = 0; col < sArr.length ; col++){
if(sV[row][sArr[col]-1] !== "") {
if(a[row][0] == "") { //Check to see if the array is empty
// If yes donot add "|"
a[row][0] = a[row][0] + sV[row][sArr[col]-1];
Logger.log(a[row][0])
}
else {
a[row][0] = a[row][0] + "|" + sV[row][sArr[col]-1];
Logger.log(a[row][0])
}
}
}
}
Logger.log(a)
var appRange = sSheet.getRange(1,sLC+1,a.length,1)
appRange.setValues(a)
}
最后注意事项:如果您打算跳过工作表中的第一行,您的循环应该从计数器1开始。由于数组索引从0开始,但工作表中的行编号从1开始。