Appmaker查询计算记录

时间:2017-10-27 11:58:05

标签: google-app-maker

我确定我做错了...但每次查询计算出的数据源时,我都会收到错误"无法处理返回的循环对象。"

这里是要点:

我有一个计算模型,用于获取用户的Google联系人,并将全名字段放入用户界面的表格中。目标是有一个单独的文本框,可用于搜索全名字段,然后使用搜索结果在同一页面上重新填充表格,类似于Google联系人搜索行为的工作方式。文本框的on值更改事件将文本框值发送到此服务器脚本:

function searchContacts (sq) {
var ds = app.models.Contacts.newQuery();
ds.filters.FullName._contains = sq;
var results = ds.run();
return results;
}

但是每次从该函数返回值时都会出现循环对象错误。执行查询运行命令(ds.run)时,实际上会触发错误。

我也尝试过查询数据源,但是我已经在某个地方读过你无法查询计算模型的数据源,因为它不存在,所以你必须这样做查询模型。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

从您的问题来看,它并非100%明确,您正在尝试做什么。如果您实际使用Calculated Model,那么您的Server Script Query应如下所示:

var sq = query.parameters.SearchQuery;
var contactsQuery = app.models.Contacts.newQuery();

contactsQuery.filters.FullName._contains = sq;
var contacts = ds.run();

var results = contacts.map(function(contact) {
  var calcRecord = app.MyCalcModel.newRecord();

  calcRecord.Name = contact.FullName;

  return calcRecord;

});

return results;

请注意,您不能从“服务器脚本查询”返回任意类型的对象,只能返回此特定计算模型的类型。

但是,从描述的某些部分和错误文本中,如果您感觉要使用google.scritp.run尝试使用异步服务器来加载记录。在这种情况下,您无法返回App Maker记录(App Script不允许这样做),您需要将它们映射到简单的JSON对象。

答案 1 :(得分:0)

我认为我在原帖上并不是很清楚。

我有一个计算模型,它是来自Google通讯录的所有用户联系人(全名,电子邮件,移动设备等等)。在用户界面上,我有一个列表小部件,其中填充了所有全名字段及以上列表小部件是用于搜索列表小部件的文本输入。因此,输入更改事件的搜索文本框会发送查询全名的请求,类似于Google Contact的搜索功能的工作方式。

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通讯录应用程序来填充计算模型有时非常慢。