Arrays 使用带有for循环的setvalues
我目前正在尝试执行“copyTo”或“setValues”操作。 我需要将一个网格(Sheet1!J16:Q36)复制到另一个网格(Sheet2!J16:Q36) 但并不是每个细胞都能被复制。只能复制与表1值不相同的值 我已经成功地尝试了下面的代码,但遗憾的是脚本需要很长时间。 我知道在数组中使用getValues的批处理操作会更快,但我缺乏执行该脚本的能力 我还使用了第三个网格来比较sheet1和2的值,并返回1或0。仅当显示值1时,for循环才会考虑该单元格。我认为这是低效的 谢谢你的帮助。我非常感激Arrays 使用带有for循环的setvalues,arrays,for-loop,google-apps-script,Arrays,For Loop,Google Apps Script,我目前正在尝试执行“copyTo”或“setValues”操作。 我需要将一个网格(Sheet1!J16:Q36)复制到另一个网格(Sheet2!J16:Q36) 但并不是每个细胞都能被复制。只能复制与表1值不相同的值 我已经成功地尝试了下面的代码,但遗憾的是脚本需要很长时间。 我知道在数组中使用getValues的批处理操作会更快,但我缺乏执行该脚本的能力 我还使用了第三个网格来比较sheet1和2的值,并返回1或0。仅当显示值1时,for循环才会考虑该单元格。我认为这是低效的 谢谢你的帮助。
var ratenprogramm = SpreadsheetApp.getActiveSpreadsheet();
var ratenprogrammmain = ratenprogramm.getSheetByName("Ratenprogramm");
var vorlageratenprogramm =
ratenprogramm.getSheetByName("VorlageRatenprogramm");
for(i=1;i<=21;i++)
{
for(j=1;j<=8;j++)
{
if(vorlageratenprogramm.getRange(37+i,9+j).getValue() == 1)
{
vorlageratenprogramm.getRange(15+i,9+j).copyTo(ratenprogrammmain.getRange(15+i,9+j),{contentsOnly: true});
}
}
}
var ratenprogram=SpreadsheetApp.getActiveSpreadsheet();
var ratenprogrammmain=ratenprogramm.getSheetByName(“ratenprogramm”);
var Vorlagrate程序=
ratenprogramm.getSheetByName(“VorlagratenProgramm”);
对于(i=1;i
- 正如您所注意到的,调用任何外部服务,包括方法
如
getValue()
使脚本变慢,请参阅
- 通过替换多个
getValue()
通过单个getValues()
请求
- 在嵌套循环中,可以指定多个范围
以及可以用,
将Sheets API方法转换为
目标图纸的相应范围,另请参见
样品
函数myFunction(){
var ratenprogram=SpreadsheetApp.getActiveSpreadsheet();
var ratenprogrammmain=ratenprogramm.getSheetByName(“ratenprogramm”);
var vorlageratenprogramm=ratenprogramm.getSheetByName(“vorlageratenprogramm”);
var数据=[];
var范围=涡率程序。getRange(15,9,21,8);
var values=range.getValues();
对于(i=0;请包括您的整个脚本,我们无法确定vorlagratenprogram
或ratenprogrammain
定义为什么。嗨,罗斯,对不起,我忘了。这些只是工作表名称。我将它们放在上面的文本中。注意:您需要手动启用工作表API才能使此脚本工作。非常感谢Ziganotschka和Ross谢谢你的帮助。关于你的代码我有两个问题:-我需要添加哪一行才能在我选择的网格中获得“数据”输入?(比如“ratenprogramm.getRange(16,9,21,8))-关于copyTo的第二个示例:这将非常有效。但我在网格中也有一些不应复制的空单元格。有没有办法忽略空单元格并复制其余的单元格?非常感谢。:)忽略空单元格的方法并不简单,在复制整个区域后,从后面删除应该保持为空的单元格可能会更简单。否则,您需要像使用if…getValue…
那样选择要复制的所有区域(慢一点)或(快一点)与我的示例中的batchUpdate
。要获取范围(16,9,21,8)中的数据,请将var range=vorlageratenprogram.getRange(15,9,21,8);
替换为var range=vorlageratenprogram.getRange(16,9,21,8)
我仍在努力使其正常工作。我不知道如何使batchUpdate正常工作。我不知道填充数组(var数据)应该在代码中的什么位置。您能告诉我将setValues(数据)部分准确地放在哪里吗?目前我还收到一个错误,该错误的状态类似于(的属性)无法读取未定义的0.0)。再次感谢您宝贵的时间。如果您使用batchUpdate
,则没有setValues()
Sheets.Spreadsheets.Values.batchUpdate(资源,电子表格ID)
将数据中指定的值设置为数据中指定的范围。唯一的问题是:如果要在不同的工作表中设置值,范围应定义为:
范围:'ratenprogram!'+单元格',我用完整的代码更新了我的答案。
function myFunction() {
var ratenprogramm = SpreadsheetApp.getActiveSpreadsheet();
var ratenprogrammmain = ratenprogramm.getSheetByName("Ratenprogramm");
var vorlageratenprogramm = ratenprogramm.getSheetByName("VorlageRatenprogramm");
var data=[];
var range=vorlageratenprogramm.getRange(15,9,21,8);
var values=range.getValues();
for(i=0;i<4;i++)
{
for(j=0;j<1;j++)
{
if(values[i+1][j] == 1)
{
var cell=range.getCell(i+1,j+1).getA1Notation();
data.push([{ range:'Ratenprogramm!'+ cell, values: [[values[i+1][j]]]}]);
}
}
}
var resource = {
valueInputOption: "USER_ENTERED",
data: data
};
Sheets.Spreadsheets.Values.batchUpdate(resource, spreadsheetId);
}