JavaScript循环仅返回最后一条结果:如何获取完整谷歌联系人列表?
问题分析与修复方案
核心问题
- 存储容器错误:你把
contactsjson定义成单个对象{},每次循环都会用新联系人的数据覆盖它,最终只保留最后一条记录。 - 多余循环无效赋值:内层的
for (var j = 0; j < id.length; j++)完全没必要——id是联系人的唯一ID字符串,这个循环会重复把同一个联系人数据赋值给contactsjson多次,毫无意义且加重逻辑混乱。
修改后的代码
function contactsJSON() { // 改为数组存储所有联系人 var contactsjson = []; var myContacts = ContactsApp.getContactGroup('System Group: My Contacts').getContacts(); for (var i = 0; i < myContacts.length; i++) { var id = myContacts[i].getId(); var name = myContacts[i].getFullName(); var emailsobj = myContacts[i].getEmails(); var email = {}; for (var j = 0; j < emailsobj.length; j++) { email[emailsobj[j].getAddress().toLowerCase()] = 1; } var phonesobj = myContacts[i].getPhones(); var phone = {}; for (var j = 0; j < phonesobj.length; j++) { phone[phonesobj[j].getPhoneNumber().replace(/[_)(\s.-]/g, '')] = 1; } // 将当前联系人对象推入数组,而非覆盖整个容器 contactsjson.push({ id: id, name: name, phone: phone, email: email }); } // 若需导出JSON字符串,直接返回JSON.stringify(contactsjson)即可 Logger.log(contactsjson); return contactsjson; }
关键修改点说明
- 将
contactsjson初始化为数组[],用于存放所有联系人对象 - 移除无意义的
id.length循环 - 使用
push()方法将每个联系人的对象添加到数组中,避免覆盖数据 - 去掉多余的
JSON.stringify再JSON.parse操作:如果需要最终导出JSON字符串,直接返回JSON.stringify(contactsjson);若需对象数组,直接返回数组即可。
内容的提问来源于stack exchange,提问作者Federico Palma
相关产品推荐
相关产品推荐

