希望有人可以让我走上正确的道路。(我认为这归结于我不了解如何使用客户端数组?)。
我拼凑的脚本会在客户端列表中查找匹配的名称,然后根据我在另一个选项卡上输入的数据来更新一堆列。最后,我希望能够完全从另一张纸上完成此操作,但是现在需要3-4分钟才能遍历整个列表。我怀疑我需要做的是获取整个数据集,对其进行修改,然后设置新值,但是我不确定我是否正确理解了这个问题。
function UpdateEntry() {
var client_name=SpreadsheetApp.getActive().getSheetByName("Rolodex!C2").getValue()
var addr=SpreadsheetApp.getActive().getSheetByName("Rolodex!C4").getValue()
var client_phone=SpreadsheetApp.getActive().getRange("Rolodex!E4").getValue()
var client_fax=SpreadsheetApp.getActive().getRange("Rolodex!E6").getValue()
var client_WWW=SpreadsheetApp.getActive().getRange("Rolodex!E7").getValue()
var data=SpreadsheetApp.getActive().getSheetByName("Rolodex").getRange("C4").getValue()
var key=SpreadsheetApp.getActive().getSheetByName("Rolodex").getRange("C2").getValue()
var database=SpreadsheetApp.getActive().getSheetByName("Database")
var datalength=database.getDataRange().getValues().length
database.getDataRange().getValues()
for (var i = 1;[i]<=datalength ; i++){
Logger.log('i: ' + i)
if(database.getRange([i],[1]).getValue() == client_name){
database.getRange([i],2).setValue(addr)
database.getRange([i],3).setValue(client_phone)
database.getRange([i],4).setValue(client_fax)
database.getRange([i],5).setValue(client_WWW)
}
}
}
相信您目前的情况和目标如下。
getValue()
是“类范围”的方法。但在var client_name=SpreadsheetApp.getActive().getSheetByName("Rolodex!C2").getValue()
,getValue
被用作类片材的方法。在这种情况下,我认为脚本的第一行会发生错误。
getSheetByName
可能是getRange
。SpreadsheetApp.getActive()
可以通过声明一次来使用。client_name,addr,client_phone,client_fax,client_WWW
可以由1检索getValues
。data
并且key
不使用。database.getDataRange().getValues()
未使用。getValue
和setValue
在循环中使用。
getValues
。并且,创建要放置到图纸上的值,然后使用创建的值放置到图纸上setValues
。setValues
是,在使用时,对于所有列长度,长度必须相同。请注意这一点。当以上几点反映到您的脚本时,它将变为以下内容。
function UpdateEntry() {
var ss = SpreadsheetApp.getActive();
// 1. Retrieve values of client_name, addr, client_phone, client_fax, client_WWW from Rolodex sheet.
var sheet = ss.getSheetByName("Rolodex");
var [[client_name],,[addr,,client_phone],,[,,client_fax],[,,client_WWW]] = ss.getRange("Rolodex!C2:E7").getValues();
var ar = [client_name, addr, client_phone, client_fax, client_WWW];
var arLength = ar.length;
// 2. Retrieve values from database sheet.
var database = ss.getSheetByName("Database");
var values = database.getDataRange().getValues();
var columnLength = values[0].length;
// 3. Create values for putting to Database sheet using the values retrieved from Rolodex sheet.
var res;
if (columnLength > arLength) {
res = values.map(r => r[0] == client_name ? ar.concat(r.slice(arLength)) : r);
} else {
res = values.map(r => r[0] == client_name ? ar : r.concat(Array(arLength - columnLength).fill("")));
}
// 4. Put the values to Database sheet.
database.getRange(1, 1, res.length, res[0].length).setValues(res);
}
使用此修改后的脚本时,请在脚本编辑器中启用V8运行时。
如果上面修改的脚本不是您期望的结果,则当前脚本可能不是您期望的结果。如果我的理解是正确的,您能否提供所需的样本输入和输出?由此,我想确认一下。
google-apps-script
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句