我撰寫了一個腳本來搜索作業表,查找滿足 7 個引數的行,回傳這些行的資料,然后向每個匹配行中的地址發送電子郵件。作為此程序的一部分,我想將“上次聯系日期”的單元格值更新為發送電子郵件的日期(這部分并不難)。我正在努力獲取包含上次聯系日期的單元格的 A1 符號,我相信我需要使用 setValue() 方法。這是代碼的相關部分:
function sendFollowUps () {
// Gets data from defined range of active sheet
var rows = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Test List').getRange(2,1,152,12).getValues()
// User-defined cutoff date, everything on or before will be contacted
var cutoffDate = new Date('11/10/2021')
console.log('Cutoff date is: ' cutoffDate)
// selects and returns only firms that haven't been met, schedule, or declined and have a date of last contact on or before the cutoffDate
var filteredRows = rows.filter(function(row) {
if (row[10] && row[10] != 'Met' && row[10] != 'Responded' && row[10] != 'Warm' && row[10] != 'Scheduled' && row[10] != 'Declined' && row[11] <= cutoffDate) {
return row
}
})
// for each firm returned by filteredRows, pulls email, firstName of investor, and firmName
filteredRows.forEach(function(row) {
var email = row[6]
var firstName = row[4].split(' ')[0]
var firmName = row[0]
var sendToEmails = ['...']
// Customized email message with firstName, firmName updated per investor
var messageSubject = '...'
var messageBody = `...`
// Adds investor email to recipient list
sendToEmails.push(email)
// Formats recipient list to CSV string
sendToEmails.join(',')
// Sends email with customized firstName and firmName to email in row
GmailApp.sendEmail(sendToEmails, messageSubject, messageBody, {'from': '[email protected]'})
followUpEmails.push(email)
}
我試過只row[11] = sendDate在 forEach 回圈中設定,但這實際上并沒有更新作業表中的單元格值。我也試過使用SpreadsheetApp.getSheetByName('Test List').getRange(row[11]), SpreadsheetApp.getSheetByName('Test List').getActiveCell(), 和SpreadsheetApp.getSheetByName('Test List').getCurrentCell(row[11]),但對這些也不滿意。
為了使用 setValue 方法,我該如何獲取行 [11] 單元格的 A1 表示法?
uj5u.com熱心網友回復:
A1 表示法幾乎不可能獲得,因為您是filter 第一個。這在之前的回答中已經提到了。但是,您可以修改陣列,然后.setValues()在整個范圍內修改修改后的陣列:
const range = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Test List').getRange(2,1,152,12);
const rows = range.getValues();
然后里面.forEach(),
row[11]=sentDate;
外面forEach():
range.setValues(rows);
請注意,這會將所有公式(如果有)替換為值。
uj5u.com熱心網友回復:
我懷疑這不能正常作業,因為您無法比較這樣的日期,因為 var cutoffDate = new Date('11/10/2021')
var filteredRows = rows.filter(function(row) {
if (row[10] && row[10] != 'Met' && row[10] != 'Responded' && row[10] != 'Warm' && row[10] != 'Scheduled' && row[10] != 'Declined' && row[11] <= cutoffDate) {
return row
}
})
同樣使用像您現在這樣的過濾器已經破壞了 foreach 中的索引與資料集中值的索引之間的連續性。我不會過濾資料,而是將資料搜索作為 forEach 的一部分執行
我認為你最好這樣做:
function sendFollowUps() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Test List');
const vs = sh.getRange(2, 1, 152, 12).getValues()
var cutoffDate = new Date('11/10/2021').valueOf();
vs.forEach(row => {
if (row[10] && row[10] != 'Met' && row[10] != 'Responded' && row[10] != 'Warm' && row[10] != 'Scheduled' && row[10] != 'Declined' && new Date(row[11]).valueOf() <= cutoffDate) {
var email = row[6];
var firstName = row[4].split(' ')[0];
var firmName = row[0];
var sendToEmails;
var messageSubject;
var messageBody;
sendToEmails.push(email)
sendToEmails.join(',')
GmailApp.sendEmail(sendToEmails, messageSubject, messageBody, { 'from': '[email protected]' });
followUpEmails.push(email)
}
});
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/380441.html
