0

我将如何格式化非连续列以复制到另一个工作表?我知道(感谢 Serge)您可以使用以下内容进行连续列!

.getRange("A2:C")

比如说我需要做 A、C、K、AD、BB 列。

有没有比分配所有需要不同变量的列更简单的方法,将它们全部单独获取,然后将它们放入所需的工作表中?

谢谢您的帮助!

4

2 回答 2

2

可能不会更简单,但我会说更好的性能,要获得一个包含您需要的所有列的大范围.get(Data)Range().getValues(),请使用 Javascript 将数组剥离到仅您需要的列,并使用setValues()一次性粘贴值:

function copyValuesOnly() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var values = ss.getSheetByName('Source').getDataRange().getValues();
  values.shift(); //remove header row
  var columns = [0, 2, 10, 29, 53]; //array of zero-based indices of required columns
  var output = [];
  for (var i = 0, length = values.length; i < length; i++) {
    output[i] = [];
    for (var j = 0, width  = columns.length; j < width; j++) {
      output[i][j] = values[i][columns[j]];
    }
  }
  ss.getSheetByName('Destination').getRange(2, 1, length, width).setValues(output);
}

问题是您是否还需要复制格式和公式,在这种情况下,最好的选择可能是单独复制粘贴每一列,正如您所提到的。

于 2013-06-25T22:40:39.290 回答
1

我的回答确实有点多余/学术,因为该=QUERY()功能将允许您做您想做的事。例如=QUERY(A1:D31,"Select C, A, B"),我还在示例表上给出了一个使用它的示例(链接如下)。QUERY也可以与@AdamL的=IMPORTRANGE() 解释一起使用。我也在我的函数中包含了该功能以进行演示。最后,我的函数可以在电子表格中使用,也可以在不加修改的脚本中使用。在我的示例电子表格中有使用QUERY(IMPORTRANGE())和我的功能的示例。copyColumns


我已经包含了一些验证,以便使用电子表格的技术含量较低的人可以使用该功能。希望它对你也有用。我已经自由地使用了 JS 功能,包括RegExpArray.map条件运算符,请在此处的评论中询问您需要的任何清晰度。

基础知识:它采用可选形式的字符串"SheetName!A,C,B"SheetName!它可以采用起始行,默认值为 1。它还可以通过给定一个 sheetKey(有或没有起始行)来处理非本地电子表格。

例如:=copyCoumns("MyDataSheet!C,A,W",8)将从第 8 行开始按顺序复制 C、A 和 W 列。

这是功能!享受!

function copyColumns(sourceRange,start,sheetKey) {
  // Initialize optional parameter
  if(!sheetKey && typeof start !== "number") {
    sheetKey = start;
    start = 1;
  } else {
    start = start || 1;
  }
  // Check SourceRange Input
  var inputRe = /^((.*?!)(?=[a-z],?|[a-i][a-z]))?[a-i]?[a-z](,[a-i]?[a-z])*$/i;
  if(!inputRe.test(sourceRange))
    throw "Invalid SourceRange: " + sourceRange;

  // Check Start Row
  if(typeof start !== "number")
    throw "Starting row must be a number! Got: " + start;
  if(start % 1 !== 0)
    throw "Starting row must be an integer! Got: " + start;
  if(start < 1)
    throw "Starting row can't be less than 1! Got: " + start;

  // Get the Source Sheet
  try {
    var ss = sheetKey
           ? SpreadsheetApp.openById(sheetKey)
           : SpreadsheetApp.getActiveSpreadsheet();
  } catch(err) {
    throw "Problem getting sheet" + sheetKey + " - " + err;
  }
  var sheetName = sourceRange.match(/^.*?(?=!)/);
  var sheet = sheetName
            ? ss.getSheetByName(sheetName[0])
            : ss.getActiveSheet();

  // Check that everything is still valid
  if(!sheet)
    throw "Could not find sheet with name: " + sheetName;
  if(start > sheet.getLastRow())
    throw "No data beyond row: " + start + " Last row: " + sheet.getLastRow();

  // Get the values
  var lastCol = sheet.getLastColumn();
  var lastRow = sheet.getLastRow()-start+1;
  var values = sheet.getRange(start,1,lastRow,lastCol).getValues();

  // Get the desired columns from the string
  var desiredColMatch = sourceRange.match(/([a-i]?[a-z](,[a-i]?[a-z])*)$/i);
  var desiredColumns = desiredColMatch[0].toUpperCase().split(",");

  // In case the column we are trying to grab doesn't exist in the sheet
  var lastColId = sheet.getMaxColumns() - 1; // Array is 0 indexed, Sheet is 1

  // Get the numerical values of the passed in Column Ids
  var columns = desiredColumns.map(function(colId){
    var num = colId.length - 1; // 0 or 1
    var colNum = colId.charCodeAt(num)-65+num*26*(colId.charCodeAt(0)-64);
    if(colNum > lastColId)
      throw "Invalid Column: " + colId + " - Column not in: " + sheetName;
    return colNum;
  });

  //Map the values to a new array of just the columns we want
  return values.map(function(row){
    return columns.map(function(col){
      return row[col]
    })
  });
}
于 2013-06-26T06:29:07.903 回答