簡體   English   中英

使用Google腳本重新排列工作表上的多列

[英]Rearrange multiple columns on sheet with Google script

我正在嘗試將VBA宏轉換為將工作表上的列從列索引數組重新排列為Google腳本

我想返回所有列,但將數組中列出的列作為前3列,而所有其他列按相同順序排列

原始的vba使用標頭名稱,但我使用列索引

我收到錯誤Incorrect range height, was 1 but should be 24錯誤Incorrect range height, was 1 but should be 24

我也不知道是否還有其他問題

提前致謝

這是我所擁有的

function myFunction() {
var sheet =SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Elements");
var data = sheet.getDataRange().getValues();
var LC = sheet.getLastColumn();
var LR = sheet.getLastRow();

var headers = [4,2,3]; //array of colunm indices
var temp = [];

var Dex = 0
for (var i = 0; i < LC; i++) {
  for(var j = 0; j < LC; j++) { 
    for (var F = 0; F < headers.length - 1; F++) {
      if (headers[F] = data[j]) {
           Dex = F
           break;
       };
     }

      if (F < i) {
         temp = data.indexOf(i);
         data[i] = data.indexOf(j)
         data[j] = temp
        }
    };
   };

  sheet.getRange(1, 1, LC,LR).setValues([data])
}   

這是VBA

Sub vba()
Dim rng As Range
Dim i As Integer
Dim J As Integer
Dim Temp
Dim nams As Variant
Dim F
Dim Dex As Integer

nams = Array("ItemID", "FirstName", "LastName", "Year")
Set rng = Range("A1").CurrentRegion

    For i = 1 To rng.Columns.Count
    For J = i To rng.Columns.Count
        For F = 0 To UBound(nams)
            If nams(F) = rng(J) Then Dex = F: Exit For
        Next F
        If F < i Then
            Temp = rng.Columns(i).Value
            rng(i).Resize(rng.Rows.Count) = rng.Columns(J).Value
            rng(J).Resize(rng.Rows.Count) = Temp
        End If
    Next J
Next i
End Sub

嘗試這個:

function moveColumns() {
  var sh=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Elements");
  var rg= sh.getDataRange()
  var vA=rg.getValues();
  var vB=[];
  var first3 = [8,7,6,5];
  var first3desc=first3.slice();
  first3desc.sort(function(a, b){return b-a;});
  for(var i=0;i<vA.length;i++){
    var row=vA[i];
    for(var j=0;j<first3.length;j++){
      row.splice(j,0,vA[i][first3[j]-1+j]);
    }
    for(var j=0;j<first3desc.length;j++){
      var c=first3desc[j]-1+first3.length;//for debugging
      row.splice(first3desc[j]-1+first3.length,1);
    }
    vB.push(row);
  }
  sh.getRange(1,1,vB.length,vB[0].length).setValues(vB);
}   

這是我這次運行的功能。

function moveColumns() {
  var sh=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Elements");
  var rg= sh.getDataRange()
  var vA=rg.getValues();
  var vB=[];
  var first3 = [8,7,6,5,4,3,2,1];
  var first3desc=first3.slice();
  first3desc.sort(function(a, b){return b-a;});
  for(var i=0;i<vA.length;i++){
    var row=vA[i];
    for(var j=0;j<first3.length;j++){
      row.splice(j,0,vA[i][first3[j]-1+j]);
    }
    for(var j=0;j<first3desc.length;j++){
      var c=first3desc[j]-1+first3.length;
      row.splice(first3desc[j]-1+first3.length,1);
    }
    vB.push(row);
  }
  sh.getRange(1,1,vB.length,vB[0].length).setValues(vB);
}   

我之前的“元素”表:

在此處輸入圖片說明

我的“元素”表如下:

在此處輸入圖片說明

在這條線上

var data = sheet.getDataRange().getValues();

數據獲取2D數組,但后來腳本將其作為1D數組處理。 換句話說,要引用一個單元格值,請使用諸如data[row][column]類的代替data[index] data[row][column]

單個等號=用於將對象/字面量分配給變量,因此此headers[F] = data[j]而不是進行比較,而將headers[F]的值替換為data[j]的對象,該對象最初是data[j]是一個數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM