如何编写Google Apps Script实现问卷匹配宠物数据的邮件推送
问题与解决方案
需求说明
用户完成Google表单问卷后,需根据填写的宠物偏好(物种为Dog、年龄为Adult或Kitten、性别为Male、体型为Small),从宠物数据集中筛选出状态为Adoptable的匹配宠物,统计匹配数量并将宠物的Name、Primary Color、Characteristics信息通过邮件发送给填写人。现有Google Apps Script代码无法实现该条件筛选逻辑,原代码如下:
function sendEmail() { var ss = SpreadsheetApp.getActiveSpreadsheet() // get sheets var response_sheet = ss.getSheetByName('survey_sheet'); var score_sheet = ss.getSheetByName('pet_data'); var Avals = response_sheet.getRange("A1:A").getValues(); var Alast = Avals.filter(String).length; // get email address var emailAddress = response_sheet.getRange(Alast,2).getValue(); // count value of matching data var count_pet = () // create message var subject = "Adoptable Pet List" // greetings var message = "Hello, This is the adoptable pet list for you.\n\n There are count_pet are available matching with your preference \n There are [Name], [Primary Color], [Characteristics ]" var text = sheet.getRange(idx,2).getValue(); message = message + text + '\n' // Send Email MailApp.sendEmail(emailAddress, subject, message); }
修正后的代码
以下是实现完整筛选与邮件发送逻辑的代码:
function sendEmail() { var ss = SpreadsheetApp.getActiveSpreadsheet(); // 获取对应工作表 var responseSheet = ss.getSheetByName('survey_sheet'); var petDataSheet = ss.getSheetByName('pet_data'); // 获取最新提交的问卷行 var lastResponseRow = responseSheet.getLastRow(); // 提取填写人邮箱及偏好信息(需确保列索引与实际问卷列一致) var emailAddress = responseSheet.getRange(lastResponseRow, 2).getValue(); var preferredSpecies = responseSheet.getRange(lastResponseRow, 3).getValue(); var preferredAge = responseSheet.getRange(lastResponseRow, 4).getValue(); var preferredGender = responseSheet.getRange(lastResponseRow, 5).getValue(); var preferredSize = responseSheet.getRange(lastResponseRow, 6).getValue(); // 获取宠物数据集(首行为表头) var petData = petDataSheet.getDataRange().getValues(); var header = petData[0]; // 通过表头定位各字段的列索引 var statusCol = header.indexOf('Status'); var nameCol = header.indexOf('Name'); var colorCol = header.indexOf('Primary Color'); var characteristicsCol = header.indexOf('Characteristics'); var speciesCol = header.indexOf('Species'); var ageCol = header.indexOf('Age'); var genderCol = header.indexOf('Gender'); var sizeCol = header.indexOf('Size'); // 筛选符合条件的可领养宠物 var matchingPets = []; for (var i = 1; i < petData.length; i++) { var row = petData[i]; var petStatus = row[statusCol]; var petSpecies = row[speciesCol]; var petAge = row[ageCol]; var petGender = row[genderCol]; var petSize = row[sizeCol]; // 匹配条件:状态为Adoptable,且符合用户偏好 if (petStatus === 'Adoptable' && petSpecies === preferredSpecies && (petAge === 'Adult' || petAge === 'Kitten') && petGender === preferredGender && petSize === preferredSize) { matchingPets.push({ name: row[nameCol], color: row[colorCol], characteristics: row[characteristicsCol] }); } } // 构建邮件内容 var subject = "可领养宠物列表"; var message = `您好,以下是为您筛选的可领养宠物列表:\n\n`; message += `符合您偏好的可领养宠物共有 ${matchingPets.length} 只\n\n`; if (matchingPets.length > 0) { message += "宠物详情:\n"; matchingPets.forEach(pet => { message += `- 姓名:${pet.name},毛色:${pet.color},特征:${pet.characteristics}\n`; }); } else { message += "暂无符合您偏好的可领养宠物"; } // 发送邮件 MailApp.sendEmail(emailAddress, subject, message); }
关键改进点
- 通过
getLastRow()直接获取最新问卷行,替代原代码中手动计算的方式,更高效可靠 - 利用表头定位字段列索引,避免硬编码列号,适配数据集结构变化
- 实现完整的多条件筛选逻辑,包含状态判断和偏好匹配
- 动态生成邮件内容,清晰展示匹配宠物信息,同时处理无匹配结果的情况
- 变量命名更语义化,提升代码可读性
内容的提问来源于stack exchange,提问作者bergpot
相关产品推荐
相关产品推荐

