gpt4 book ai didi

javascript - 连接动态列数 Google 脚本

转载 作者:行者123 更新时间:2023-12-03 02:37:44 26 4
gpt4 key购买 nike

我需要连接每个项目的 x 列数,有时是 3 列,其他是 7 或 5 列,这取决于

我正在尝试使用范围列号数组来实现此目的,例如 [2,5,3]

第 2,5 3 列按顺序排列,此处带有分隔符 |

我进行了搜索,但只找到了静态连接函数

我有一个 VBA 宏,可以在 Excel 中按照我的需要工作,因此我尝试用 Google 脚本编写它

该函数运行时没有错误,但没有返回任何内容从 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

最佳答案

第 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 开始。

关于javascript - 连接动态列数 Google 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48472302/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com