google-apps-script - 使用谷歌应用脚本复制/粘贴值
问题描述
这是带有我正在使用的数据示例的表格
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
}
}
这是我的数据如何根据列号复制/粘贴的示例
解决方案
当您从电子表格中检索值时,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
}
确保数组是二维的并且其维度(行和列)与您要设置数据的范围的维度相对应非常重要。
推荐阅读
- sas - SAS中的双向方差分析
- discord - 如何在没有命令提示符的情况下保持 python discord bot 在线运行?
- php - 使用 laravel yield() 函数有什么假设?
- python - 在图像中找到矩形并提取其中的文本以将其保存为新图像
- apache - 重写 url - apache - htaccess
- django - 运行配置错误:请在 PyCharm 中指定脚本名称
- jpa - @Stateless 和 @Asynchronous EJB 之间的 JPA 事务处理
- html - 更改响应背景颜色的文本颜色
- python - Pandas 数据框获取列名和 value_counts
- python - 将 Pandas 数据框转换为字典