首页 > 解决方案 > 使用谷歌应用脚​​本复制/粘贴值

问题描述

这是带有我正在使用的数据示例的表格

https://docs.google.com/spreadsheets/d/1_k3xclEgdREfMMks7H2-uk0tzxXqCaoeVW_G8ase-3o/edit?usp=sharing

我只将公式放在没有颜色的行上,有关时间表的信息来自其他选项卡。

绿色的颜色是带有日期的颜色,我存储在数字中,蓝色的还包含公式,我想在粘贴值时跳过这些列,因为与另一个工作表相关,所以我不能粘贴值

我试过两种方法

这第一个我收到一条错误消息:异常:参数(数字 [])与 SpreadsheetApp.Range.setValues 的方法签名不匹配。

//destination = sheet.getRange(1,colA[j],table.length,1)
//destination.setValues(table); // where we paste the values by column 

对于这个,它粘贴在第一列的其他选项卡上

//sheet.getRange(1,colA[j],table.length,1).copyTo(sheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

这是我使用的脚本

function PasteValues() {
  var ss =  SpreadsheetApp.openById("...");
  var sheet = ss.getSheetByName("Testsheet");
  var rows = sheet.getDataRange().getValues();
  var dates = rows[2];
  //Logger.log(dates)
  var yesterday = new Date(Date.now() - 864e5);
  var numbers = [];
  
  
  for(var i = 2; i < dates.length; i++) {
    let columns = i
    if (dates[i]!==""  &&  dates[i] !== null){
      numbers.push(columns);
    }
    
    if (dates[i]==="") {
    continue;
    }
    if (dates[i].getDate() == yesterday.getDate() && dates[i].getMonth() == yesterday.getMonth() ){
      break;
    }
  }
  colA=numbers.slice(-5)


  var table = [];
  Logger.log(rows.length)
  Logger.log(colA)
  for(var j=0;j<colA.length;j++)
  { 
    table =[];
    for (var i = 0; i < rows.length;i++ )
    { 
     table[i] = rows[i][colA[j]];
    }
    Logger.log("the number of the column is: "+colA[j]);
    Logger.log(table);
    // where I paste the data

  }
  
}

这是我的数据如何根据列号复制/粘贴的示例

在此处输入图像描述

标签: google-apps-scriptgoogle-sheetsgoogle-sheets-formula

解决方案


当您从电子表格中检索值时,getValues()已经将它们以二维数组的形式返回给您 - 无需手动将它们转移到另一个数组中

你可以这样做:

var table = sheet.getDataRange().getValues();
destination = sheet.getRange(1,statColumn,table.length,table[0].length);
destination.setValues(table);

或者:

sheet.getDataRange.copyTo(sheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

更新

例外:参数 (number[]) 与 SpreadsheetApp.Range.setValues 的方法签名不匹配。

表示您正在尝试将一行(一维数组)分配给一个范围(二维数组)。

此外,table.length如果是一行,将检索您的列数而不是行数table

这可以通过定义轻松解决: table = [table];

示例片段:

  for(var j=0;j<colA.length;j++)
  { 
    table =[];
    for (var i = 0; i < rows.length;i++ )
    { 
      table[i] = rows[i][colA[j]];
    }
    Logger.log("the number of the column is: "+colA[j]);
    table = [table];
    Logger.log(table);
    // where I paste the data
    destination = sheet.getRange(1,colA[j],table.length,1)
    destination.setValues([table]); // where we paste the values by column 
  }

更新

如果您想要逐列复制粘贴选定的数据,则需要创建一个二维数组table并将其填充如下:

  for(var i = 2; i < dates.length; i++) {
    let columns = i
    if (dates[i]!==""  &&  dates[i] !== null){
      numbers.push(columns);
    }
    
    if (dates[i]==="") {
      continue;
    }
    if (dates[i] instanceof Date && dates[i].getDate() == yesterday.getDate() && dates[i].getMonth() == yesterday.getMonth() ){
      break;
    }
  }
  colA=numbers.slice(-5)
  
  
  var table = [];
  Logger.log(rows.length)
  Logger.log(colA)
  for(var j=0;j<colA.length;j++)
  { 
    
    for (var i = 0; i < rows.length;i++ )
    { 
      table[i] =[];
      table[i][0] = rows[i][colA[j]];
    }
    Logger.log("the number of the column is: "+colA[j]);
    Logger.log(table);
    // where I paste the data
    destination = sheet.getRange(1,colA[j],table.length,1)
    destination.setValues(table); // where we paste the values by column 
  }

确保数组是二维的并且其维度(行和列)与您要设置数据的范围的维度相对应非常重要。


推荐阅读