我认为我的原始帖子不是很清楚。
我有一个计算模型,它是来自 Google 联系人的所有用户联系人(全名、电子邮件、手机等...)在 UI 上,我有一个列表小部件,其中填充了所有全名字段及以上列表小部件 用于搜索列表小部件的文本输入。因此,搜索文本框的输入更改事件会发送一个查询全名的请求,类似于 Google 联系人的搜索功能的工作原理。
Screen Shot
App Maker 似乎不允许您查询计算模型,所以我有这个解决方法 - 除非有人想出更好的方法:
这是搜索文本框的 onInputChange 处理程序:
sq = app.pages.SelectClient.descendants.TextBox1.value;
app.datasources.SearchContacts.query.parameters.Name = sq;
app.datasources.SearchContacts.load();
这是服务器脚本代码(感谢@Pavel Shkleinik 的提醒):
var sq = query.parameters.Name;
if (sq !== null) {
return getContactsbyName(sq);
} else {
return getContacts();
}
以及没有查询的服务器代码:
function getContacts() {
var results = [];
var contacts = ContactsApp.getContacts();
contacts.forEach(function(item) {
var contact = app.models.Contacts.newRecord();
contact.FullName = item.getFullName();
var emails = item.getEmails(ContactsApp.Field.WORK_EMAIL);
if (emails.length > 0) {
contact.PrimaryEmail = emails[0].getAddress();
}
contact.LastName = item.getFamilyName();
contact.FirstName = item.getGivenName();
var phones = item.getPhones(ContactsApp.Field.MOBILE_PHONE);
if (phones.length > 0) {
contact.Mobile = phones[0].getPhoneNumber();
}
var addresses = item.getAddresses(ContactsApp.Field.WORK_ADDRESS);
if (addresses.length > 0) {
contact.Address = addresses[0].getAddress();
}
results.push(contact);
results.sort();
});
return results;
}
还有查询:
function getContactsbyName(sq) {
var results = [];
var contacts = ContactsApp.getContactsByName(sq);
contacts.forEach(function(item) {
var contact = app.models.Contacts.newRecord();
contact.FullName = item.getFullName();
var emails = item.getEmails(ContactsApp.Field.WORK_EMAIL);
if (emails.length > 0) {
contact.PrimaryEmail = emails[0].getAddress();
}
contact.LastName = item.getFamilyName();
contact.FirstName = item.getGivenName();
var phones = item.getPhones(ContactsApp.Field.MOBILE_PHONE);
if (phones.length > 0) {
contact.Mobile = phones[0].getPhoneNumber();
}
var addresses = item.getAddresses(ContactsApp.Field.WORK_ADDRESS);
if (addresses.length > 0) {
contact.Address = addresses[0].getAddress();
}
results.push(contact);
results.sort();
});
return results;
}
这样,当不存在搜索查询时,列表会填充所有名称,然后根据需要使用搜索查询结果重新填充。
唯一的问题是调用 Google 通讯录应用填充计算模型有时非常慢。