在同一电子表格中,我有2张纸(2020年和数据库)。
在工作表“ 2020”中,我有2列ID和EMAIL。
在“数据库”工作表中,我有很大的数据范围(22列和12400行),但是我仅使用3列来通过ID获取EMAIL。 (而且速度很慢!)。
在“ 2020”中,当我在ID列中输入值时,将在工作表“数据库”上进行查询以填充EMAIL列。
我的问题是此查询太慢。我读了一些有关“缓存服务”的信息,我认为这是加快查询速度的一种方法,但是我不明白**如何缓存整个工作表以及如何在此缓存的数据中进行查询。
[EMAIL列的第一个单元格(标题上方)的值:
=query(DATABASE!G$2:H;"select G where H = '"&A2&"'");)
2020!A2 = ID号
DATABASE!H =数据库的ID列
DATABASE!G =数据库的EMAILs列
通过ID获取电子邮件
也许您可以做这样的事情:
此函数返回一个字符串化的JSON对象,该对象保存在缓存中,并且可以通过知道ID来检索电子邮件。我使用了一个对话框来显示数据,您可以将其修改为所需的任何内容。
如果它们不完全是“ ID”和“ EMAIL”,则需要更新工作表名称并更改标题名称。
function getEmailObj() {
var cache = CacheService.getScriptCache();
var cached = cache.get("emails");
if (cached != null) {
return cached;
}
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('Sheet1');
var rg=sh.getDataRange();
var vA=rg.getValues();
var hA=vA.shift();
var idx={};//associates header name with data array index
hA.forEach(function(hdr,i){idx[hdr]=i;});
var getEmailById={idA:[]};//associates email address with ID
vA.forEach(function(r,i){
getEmailById[r[idx['ID']]]=r[idx['EMAIL']];
getEmailById.idA.push(r[idx['ID']]);
});
var results=JSON.stringify(getEmailById);//return JSON string
cache.put("emails",results, 60); // cache for 1 minute Save JSON string
return results;
}
function getEmailsById() {
var eObj=JSON.parse(getEmailObj());//parse JSON string to get object
var html='<style>th,td{border:1px solid black;padding:2px 5px;}</style><table><tr><th>ID</th><th>Email</th></tr>';
eObj.idA.forEach(function(id){
html+=Utilities.formatString('<tr><td>%s</td><td>%s</td></tr>',id,eObj[id]);
});
html+='</table>';
var userInterface=HtmlService.createHtmlOutput(html);
SpreadsheetApp.getUi().showModelessDialog(userInterface, "Emails")
}