Google Apps 脚本 - 如果下一行也符合搜索条件,我如何在搜索后传输多个数据行,从数据 sheet 到表单?
Google Apps Script - How do I transfer multiple data rows after search, from data sheet to form, if the next row also meets search criteria?
Image of Sales Sheet
Image of Sales Form - with Headers
我正在为地毯零售建立一个库存系统,到目前为止管理得很好,但我完全无法使用简单的查找和转移代码。
ws 有几个 sheet,但这里感兴趣的两个是“销售表格”和“销售”sheet。两者都有相应的数据标题,如“发票编号”、“产品名称”、“数量”、“销售日期”等。它们还有复选框,指示产品是否需要切割或是否已安装。
销售表格基于地板销售的输入数据并将其传输到销售 sheet - 这里没问题。
清除表格、插入今天的日期或在搜索中从设置的发票编号中查找第一个产品也没有问题。
想法是在销售表格中输入发票编号sheet;在 Sales sheet 上查找相应的发票编号;然后 return 将找到的所有产品信息返回到销售表格(以编辑、检查、审查等)。
但是一旦脚本发送第一个 'found product' 我就不能让它移动到下一行并搜索,或者下一行或下一行等等...
最初,函数末尾的“return”不存在,我只有找到的最后一项return显示在搜索表单上。
function searchSales(){
var ss=SpreadsheetApp.getActiveSpreadsheet()
var shUserForm = ss.getSheetByName("Sales Form")
var shSalesSheet = ss.getSheetByName("Sales")
var sValue = shUserForm.getRange("E5").getValue();
var sData = shSalesSheet.getDataRange().getValues();
for (var i = 0; i < sData.length; i++){
var row = sData[i];
if(row[0] == sValue){
shUserForm.getRange("C5").setValue(row[3]); //Transfer Sales Date
shUserForm.getRange("C9").setValue(row[1]); //Transfer Product Name
shUserForm.getRange("E9").setValue(row[2]); //Transfer Qty
if(row[4] == true){
shUserForm.getRange("G9").setValue(false); //Transfer If Cut or Not
}
if(row[5] == true){
shUserForm.getRange("J9").setValue(true); //Transfer If Fitted or Not
}
return
}
}}
请帮忙!
尝试按如下方式增加 currentRow(我希望每个项目之间有一个空行)
function searchSales() {
var ss = SpreadsheetApp.getActiveSpreadsheet()
var shUserForm = ss.getSheetByName("Sales Form")
var shSalesSheet = ss.getSheetByName("Sales")
var sValue = shUserForm.getRange("E5").getValue();
var sData = shSalesSheet.getDataRange().getValues();
var currentRow = 9
for (var i = 0; i < sData.length; i++) {
var row = sData[i];
if (row[0] == sValue) {
shUserForm.getRange("C5").setValue(row[3]); //Transfer Sales Date
shUserForm.getRange("C" + currentRow).setValue(row[1]); //Transfer Product Name
shUserForm.getRange("E" + currentRow).setValue(row[2]); //Transfer Qty
if (row[4] == true) {
shUserForm.getRange("G" + currentRow).setValue(false); //Transfer If Cut or Not
}
if (row[5] == true) {
shUserForm.getRange("J" + currentRow >).setValue(true); //Transfer If Fitted or Not
}
currentRow += 2
}
}
}
这是一次检索和显示所有数据的优化解决方案:
function searchSales() {
const ss = SpreadsheetApp.getActiveSpreadsheet()
const shUserForm = ss.getSheetByName("Sales Form")
const shSalesSheet = ss.getSheetByName("Sales")
const searchValue = shUserForm.getRange("E5").getValue()
const salesData = shSalesSheet.getDataRange()
.getValues()
const targetSales = salesData.filter(row => row[0] === searchValue)
if (targetSales.length) {
const formData = []
targetSales.forEach(item => {
const toCut = (item[4] === true) ? false : true
const rowData = [item[1], ``, item[2], ``, toCut, ``, ``, item[5]]
formData.push(rowData, Array(rowData.length).fill(``))
})
shUserForm.getRange(`C5`).setValue(targetSales[0][3])
shUserForm.getRange(9, 3, formData.length, formData[0].length)
.setValues(formData)
}
}
Image of Sales Sheet
Image of Sales Form - with Headers
我正在为地毯零售建立一个库存系统,到目前为止管理得很好,但我完全无法使用简单的查找和转移代码。
ws 有几个 sheet,但这里感兴趣的两个是“销售表格”和“销售”sheet。两者都有相应的数据标题,如“发票编号”、“产品名称”、“数量”、“销售日期”等。它们还有复选框,指示产品是否需要切割或是否已安装。
销售表格基于地板销售的输入数据并将其传输到销售 sheet - 这里没问题。 清除表格、插入今天的日期或在搜索中从设置的发票编号中查找第一个产品也没有问题。
想法是在销售表格中输入发票编号sheet;在 Sales sheet 上查找相应的发票编号;然后 return 将找到的所有产品信息返回到销售表格(以编辑、检查、审查等)。
但是一旦脚本发送第一个 'found product' 我就不能让它移动到下一行并搜索,或者下一行或下一行等等...
最初,函数末尾的“return”不存在,我只有找到的最后一项return显示在搜索表单上。
function searchSales(){
var ss=SpreadsheetApp.getActiveSpreadsheet()
var shUserForm = ss.getSheetByName("Sales Form")
var shSalesSheet = ss.getSheetByName("Sales")
var sValue = shUserForm.getRange("E5").getValue();
var sData = shSalesSheet.getDataRange().getValues();
for (var i = 0; i < sData.length; i++){
var row = sData[i];
if(row[0] == sValue){
shUserForm.getRange("C5").setValue(row[3]); //Transfer Sales Date
shUserForm.getRange("C9").setValue(row[1]); //Transfer Product Name
shUserForm.getRange("E9").setValue(row[2]); //Transfer Qty
if(row[4] == true){
shUserForm.getRange("G9").setValue(false); //Transfer If Cut or Not
}
if(row[5] == true){
shUserForm.getRange("J9").setValue(true); //Transfer If Fitted or Not
}
return
}
}}
请帮忙!
尝试按如下方式增加 currentRow(我希望每个项目之间有一个空行)
function searchSales() {
var ss = SpreadsheetApp.getActiveSpreadsheet()
var shUserForm = ss.getSheetByName("Sales Form")
var shSalesSheet = ss.getSheetByName("Sales")
var sValue = shUserForm.getRange("E5").getValue();
var sData = shSalesSheet.getDataRange().getValues();
var currentRow = 9
for (var i = 0; i < sData.length; i++) {
var row = sData[i];
if (row[0] == sValue) {
shUserForm.getRange("C5").setValue(row[3]); //Transfer Sales Date
shUserForm.getRange("C" + currentRow).setValue(row[1]); //Transfer Product Name
shUserForm.getRange("E" + currentRow).setValue(row[2]); //Transfer Qty
if (row[4] == true) {
shUserForm.getRange("G" + currentRow).setValue(false); //Transfer If Cut or Not
}
if (row[5] == true) {
shUserForm.getRange("J" + currentRow >).setValue(true); //Transfer If Fitted or Not
}
currentRow += 2
}
}
}
这是一次检索和显示所有数据的优化解决方案:
function searchSales() {
const ss = SpreadsheetApp.getActiveSpreadsheet()
const shUserForm = ss.getSheetByName("Sales Form")
const shSalesSheet = ss.getSheetByName("Sales")
const searchValue = shUserForm.getRange("E5").getValue()
const salesData = shSalesSheet.getDataRange()
.getValues()
const targetSales = salesData.filter(row => row[0] === searchValue)
if (targetSales.length) {
const formData = []
targetSales.forEach(item => {
const toCut = (item[4] === true) ? false : true
const rowData = [item[1], ``, item[2], ``, toCut, ``, ``, item[5]]
formData.push(rowData, Array(rowData.length).fill(``))
})
shUserForm.getRange(`C5`).setValue(targetSales[0][3])
shUserForm.getRange(9, 3, formData.length, formData[0].length)
.setValues(formData)
}
}