【问题标题】:Concatenate a dynamic Number of columns Google Script连接动态列数 Google Script
【发布时间】:2018-01-27 03:32:04
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    第 1 部分:输出中的未定义值
    您得到以下输出的原因:undefined|b|e|c 是因为变量 a[row][0] 在您为其分配任何值之前未定义。因此,当程序第一次在循环中运行以下代码行时,它会将sV[row][sArr[col]] 的值连接到未定义。

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

    【讨论】:

    • 杰克,感谢您的回复。对于这个appRange.setValues(a),我收到此错误Cannot convert Array to Object[][]。解释太棒了!
    • 现在应该修复了,请注意在数组索引中使用sArr[col]-1。再次修复从工作表编号到数组编号的索引更改。
    • 杰克,太好了,感谢代码和注释对理解很有帮助
    猜你喜欢
    • 1970-01-01
    • 2021-12-14
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多