我有三张床单,如果用户电子邮件地址与QUOTATIONS工作簿中的工作表名称匹配,则从该工作表中获取P列中指定产品的价格。如果未找到工作表名称,则从PRODUCTS工作表中获取该产品的价格。价格还取决于在工作表中指定的货币。预期结果的示例可在JOBS工作表的Q列https://docs.google.com/spreadsheets/d/1up7cUvQqL-LcA7EeuM65B0zjcRT46LGwN2x3C_4j0bY/edit?usp=sharing中查看。如果用户有报价,并且电子邮件与工作表名称匹配,则价格来自QUOTATIONS工作簿https://docs.google.com/spreadsheets/d/10tb0zE_8i849T-hL6mU-Pw_4V-aMzNZJGNOFYG1F3qk/edit?usp=sharing。如果用户没有报价,并且没有匹配的电子邮件地址,则价格来自来自产品表https://docs.google.com/spreadsheets/d/1pt7YnN9fmoD4PE0o9oVPezK8Qz6ZmabyJbWXfdzFeMU/edit?usp=sharing
我有以下脚本,它确实匹配产品表和工作表之间的价格,但无法让它也检查是否存在表名称,它匹配工作表中的电子邮件地址,然后从该表中获得价格。感谢帮助,谢谢
function updateQuotationPrice() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var jobSheet = ss.getSheetByName('JOBS');
var productSheet = SpreadsheetApp.openById("1pt7YnN9fmoD4PE0o9oVPezK8Qz6ZmabyJbWXfdzFeMU").getSheetByName('PRODUCTS');
var quotationSheet = SpreadsheetApp.openById("10tb0zE_8i849T-hL6mU-Pw_4V-aMzNZJGNOFYG1F3qk");
var sheetNames = []
var sheets = quotationSheet.getSheets()//.forEach(function(sheet){sheets[sheet.getName()]=sheet;});
sheets.forEach(function (sheet) {
sheetNames.push(sheet.getName());
console.log(sheets)
});
var objEuro = productSheet.getRange("A2:D" + productSheet.getLastRow()).getValues().reduce((o, r) => (o[r[0]] = r[3], o), {});
var objSterling = productSheet.getRange("A2:D" + productSheet.getLastRow()).getValues().reduce((o, r) => (o[r[0]] = r[2], o), {});
var objQuotationEuro = sheets.getRange("A2:D" + sheets.getLastRow()).getValues().reduce((o, r) => (o[r[0]] = r[3], o), {});
var objQuotationSterling = sheets.getRange("A2:D" + sheets.getLastRow()).getValues().reduce((o, r) => (o[r[0]] = r[2], o), {});
var range = jobSheet.getRange("O2:AK" + jobSheet.getLastRow());
var euroValues = range.getValues().map(r => [objEuro[r[0]] || null]);
var sterlingValues = range.getValues().map(r => [objSterling[r[0]] || null]);
var quotationEuroValues = range.getValues().map(r => [objQuotationEuro[r[0]] || null]);
var quotationSterlingValues = range.getValues().map(r => [objQuotationSterling[r[0]] || null]);
var vs = jobSheet.getRange("O2:R"+ jobSheet.getLastRow()).getValues();
vs.forEach((r) => {
if(r[0] == "EURO" && r[1].match(/^A/i) && sheets != r[3] ){
range.offset(0, 2, euroValues.length, 1).setValues(euroValues)};
if(r[0] == "STERLING" && r[1].match(/^A/i) && sheets != r[3]){
range.offset(0, 2, sterlingValues.length, 1).setValues(sterlingValues)}
if(r[0] == "EURO" && r[1].match(/^A/i) && sheets == r[3] ){
range.offset(0, 2, quotationValues.length, 1).setValues(quotationEuroValues)}
if(r[0] == "STERLING" && r[1].match(/^A/i) && sheets == r[3] ){
range.offset(0, 2, quotationValues.length, 1).setValues(quotationSterlingValues)}
});
}
1条答案
按热度按时间t9aqgxwy1#
建议
我创建了另一种方法,其中我仍然使用
forEach()
函数来处理数据,但是,我使用filter()
和includes()
函数来帮助数据匹配过程。脚本
您可以使用以下脚本作为脚本的基础。
输出
参考文献