英文:
How to search and match if a sheet name from a cell value in another sheet in google apps script and copy cells
问题
以下是代码的中文翻译部分:
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();
sheets.forEach(function (sheet) {
sheetNames.push(sheet.getName());
});
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);
}
});
}
请注意,代码中的翻译可能不是百分之百准确,具体的代码逻辑可能需要进一步验证和调整。
英文:
I have three sheets, in the JOBS sheet if the user email address matches a sheet name in the QUOTATIONS workbook then the price is taken from that sheet for the specified product in column P. If no sheet name is found then the price for that product is taking from the PRODUCTS sheet. The price also depends on the currency which is specified in the JOBS sheet.
A sample of the expected results can be viewed in the JOBS sheet in column Q at https://docs.google.com/spreadsheets/d/1up7cUvQqL-LcA7EeuM65B0zjcRT46LGwN2x3C_4j0bY/edit?usp=sharing
If the user has a quotation and the email matches a sheet name then the price comes from QUOTATIONS workbook at
https://docs.google.com/spreadsheets/d/10tb0zE_8i849T-hL6mU-Pw_4V-aMzNZJGNOFYG1F3qk/edit?usp=sharing
If the user has no quotation and there is no matching email address the price comes from the products sheet
https://docs.google.com/spreadsheets/d/1pt7YnN9fmoD4PE0o9oVPezK8Qz6ZmabyJbWXfdzFeMU/edit?usp=sharing
I have the following script which does match the price between the products sheet and the jobs sheet but unable to have it also check if a sheet name exists and it matches the email address in the jobs sheet and then gets the price from that sheet. Assistance is appreciated, thanks
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
得分: 2
I have created another approach wherein I still used the forEach()
function to process the data. However, I used the filter()
and includes()
function to help in the data matching process.
你提出了另一种方法,在其中仍然使用了 forEach()
函数来处理数据。不过,我使用了 filter()
和 includes()
函数来帮助数据匹配过程。
You may use the following script as the basis for your script.
你可以将以下脚本作为你的脚本的基础使用。
function updateQuotationPrice() {
var ss1 = SpreadsheetApp.openById("User Update Sheet ID"); // 用户更新
var ss2 = SpreadsheetApp.openById("Quotation Sheet ID"); // 报价
var ss3 = SpreadsheetApp.openById("Projects Sheet ID"); // 项目
// 从用户更新中提取数据
var lr1 = ss1.getSheetByName("Jobs").getLastRow();
var data1 = ss1.getSheetByName("Jobs").getRange(2, 13, lr1 - 1, 4).getValues();
// 从报价电子表格中提取数据
var sheetNames2 = [];
ss2.getSheets().forEach(x => sheetNames2.push(x.getName()));
// 处理数据 1
var output = [];
data1.forEach(x => {
if (sheetNames2.includes(x[0]) && ss2.getSheetByName(x[0]).getDataRange().getValues().filter(y => y.includes(x[3])).length > 0) { // 在这里添加了新的条件
if (x[2] == "EURO") {
output.push([ss2.getSheetByName(x[0]).getDataRange().getValues().filter(y => y includes(x[3]))[0][3]]);
} else if (x[2] == "STERLING") {
output.push([ss2.getSheetByName(x[0]).getDataRange().getValues().filter(y => y.includes(x[3]))[0][2]]);
}
} else {
if (x[2] == "EURO") {
output.push([ss3.getSheetByName("Products").getDataRange().getValues().filter(y => y.includes(x[3]))[0][3]]);
} else if (x[2] == "STERLING") {
output.push([ss3.getSheetByName("Products").getDataRange().getValues().filter(y => y.includes(x[3]))[0][2]]);
}
}
});
// 输出
ss1.getSheetByName("Jobs").getRange(2, 17, lr1 - 1, 1).setValues(output);
}
References
参考资料
英文:
Suggestion
I have created another approach wherein I still used the forEach()
function to process the data. However, I used the filter()
and includes()
function to help in the data matching process.
Script
You may use the following script as basis for your script.
function updateQuotationPrice() {
var ss1 = SpreadsheetApp.openById("User Update Sheet ID"); //User Update
var ss2 = SpreadsheetApp.openById("Quotation Sheet ID"); //Quotation
var ss3 = SpreadsheetApp.openById("Projects Sheet ID"); //Projects
//Extract data from User Update
var lr1 = ss1.getSheetByName("Jobs").getLastRow();
var data1 = ss1.getSheetByName("Jobs").getRange(2, 13, lr1 - 1, 4).getValues();
//Extract data from Quotation Spreadsheet
var sheetNames2 = [];
ss2.getSheets().forEach(x => sheetNames2.push(x.getName()));
//Process data 1
var output = [];
data1.forEach(x => {
if (sheetNames2.includes(x[0]) && ss2.getSheetByName(x[0]).getDataRange().getValues().filter(y => y.includes(x[3])).length > 0) { // added new condition here
if (x[2] == "EURO") {
output.push([ss2.getSheetByName(x[0]).getDataRange().getValues().filter(y => y.includes(x[3]))[0][3]]);
}
else if (x[2] == "STERLING") {
output.push([ss2.getSheetByName(x[0]).getDataRange().getValues().filter(y => y.includes(x[3]))[0][2]]);
}
}
else {
if (x[2] == "EURO") {
output.push([ss3.getSheetByName("Products").getDataRange().getValues().filter(y => y.includes(x[3]))[0][3]]);
}
else if (x[2] == "STERLING") {
output.push([ss3.getSheetByName("Products").getDataRange().getValues().filter(y => y.includes(x[3]))[0][2]]);
}
}
});
//Output
ss1.getSheetByName("Jobs").getRange(2, 17, lr1 - 1, 1).setValues(output);
}
Output
References
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论