Appmaker查询计算记录

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

这是要点:

我有一个计算模型,可以获取用户的谷歌联系人,并将全名字段放在用户界面的表格中 . 目标是有一个单独的文本框,可用于搜索全名字段,然后使用搜索结果在同一页面上重新填充表格,类似于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)

3 years ago

从你的问题来看,它不是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 加载异步serever调用的记录 . 在这种情况下,您无法返回App Maker记录(App Script不允许这样做),您需要将它们映射到简单的JSON对象 .

3 years ago

我不认为我在原帖上超级清晰 .

我有一个计算模型,它是来自谷歌联系人的所有用户联系人(全名,电子邮件,移动等等) . 在用户界面上,我有一个列表小部件,其中填充了所有全名字段和列表小部件上方用于搜索列表小部件的文本输入 . 因此,输入更改事件中的搜索文本框会发送查询全名的请求,类似于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通讯录应用程序来填充计算模型有时非常慢 .