连接动态列数Google Script

时间:2018-01-27 03:32:05

标签: javascript google-apps-script google-sheets

我需要连接每个项目的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

1 个答案:

答案 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开始。