Я сделал новый фиктивный лист. Я включил ожидаемый результат и текущий результат в свой текущий код. Я пытался изо всех сил попытаться закодировать это, но в конечном итоге это не работает для меня. По сути, мне нужен пустой Trans с количеством, которое нужно добавить к одному Trans. То же самое с ценой и скидкой. Это продолжение моего предыдущего вопроса, поэтому, если вам нужны разъяснения, пожалуйста, проверьте и это. Дайте мне знать, если вам нужна дополнительная информация или помощь. Если вы можете помочь, большое спасибо. Любая помощь/совет приветствуется! Большое спасибо за ваши усилия и помощь! Дайте мне знать, если что-то еще нужно.
Ссылка лист .
Примечание. Пожалуйста, игнорируйте переменную/параметр «Категория», так как он не имеет отношения к этой теме/вопросу.
Код AppScript:
var RemoveDupV1 = "";
var RemoveDubVV1 = "";
var Time2List = [];
var Trans2List = [];
var RemoveDupV2 = "";
var RemoveDupV3 = "";
var RemoveDupV4 = 0;
var RemoveDupV5 = 0;
var RemoveDupV6 = 0;
function RemoveDup1(Trans1, Trans2, Time1, Time2, Category, Quantity1, Quantity2, Disc1, Disc2, Price1, Price2) {
if (Trans1.localeCompare(Trans2) == 0){
if (Time1.localeCompare(Time2) == 0){
RemoveDup2V1(Trans2, Time2);
PropertiesService.getScriptProperties().setProperty('myArray', Trans2);
return(Trans1);
}else{
return(Trans1)
}
}else{
return(Trans1)
}
}
function RDR1(Trans1, Trans2, Time1, Time2, Category, Quantity1, Quantity2, Disc1, Disc2, Price1, Price2){
RemoveDupV1 = RemoveDup1(Trans1, Trans2, Time1, Time2, Category, Quantity1, Quantity2, Disc1, Disc2, Price1, Price2);
return(RemoveDupV1)
}
function RemoveDup2V1(Trans2,Time2) {
Trans2List.push(Trans2);
Time2List.push(Time2);
}
// Time
function RemoveDup2(Trans1, Trans2, Time1, Time2, Category, Quantity1, Quantity2, Disc1, Disc2, Price1, Price2) {
if (Trans1.localeCompare(Trans2) == 0){
if (Time1.localeCompare(Time2) == 0){
return(Time1);
}else{
return(Time1)
}
}else{
return(Time1)
}
}
function RDR2(Trans1, Trans2, Time1, Time2, Category, Quantity1, Quantity2, Disc1, Disc2, Price1, Price2){
RemoveDupV2 = RemoveDup2(Trans1, Trans2, Time1, Time2, Category, Quantity1, Quantity2, Disc1, Disc2, Price1, Price2);
return(RemoveDupV2)
}
// Category
function RemoveDup3(Trans1, Trans2, Time1, Time2, Category, Quantity1, Quantity2, Disc1, Disc2, Price1, Price2) {
if (Trans1.localeCompare(Trans2) == 0){
if (Time1.localeCompare(Time2) == 0){
return(Category);
}else{
return(Category)
}
}else{
return(Category)
}
}
function RDR3(Trans1, Trans2, Time1, Time2, Category, Quantity1, Quantity2, Disc1, Disc2, Price1, Price2){
RemoveDupV3 = RemoveDup3(Trans1, Trans2, Time1, Time2, Category, Quantity1, Quantity2, Disc1, Disc2, Price1, Price2);
return(RemoveDupV3)
}
// Quantity
function RemoveDup4(Trans1, Trans2, Time1, Time2, Category, Quantity1, Quantity2, Disc1, Disc2, Price1, Price2) {
if (Trans1.localeCompare(Trans2) == 0){
if (Time1.localeCompare(Time2) == 0){
return(Quantity1 + Quantity2);
}else{
return(Quantity1)
}
}else{
return(Quantity1)
}
}
function RDR4(Trans1, Trans2, Time1, Time2, Category, Quantity1, Quantity2, Disc1, Disc2, Price1, Price2){
RemoveDupV4 = RemoveDup4(Trans1, Trans2, Time1, Time2, Category, Quantity1, Quantity2, Disc1, Disc2, Price1, Price2);
return(RemoveDupV4)
}
// Disc
function RemoveDup5(Trans1, Trans2, Time1, Time2, Category, Quantity1, Quantity2, Disc1, Disc2, Price1, Price2) {
if (Trans1.localeCompare(Trans2) == 0){
if (Time1.localeCompare(Time2) == 0){
return(Disc1 + Disc2);
}else{
return(Disc1)
}
}else{
return(Disc1)
}
}
function RDR5(Trans1, Trans2, Time1, Time2, Category, Quantity1, Quantity2, Disc1, Disc2, Price1, Price2){
RemoveDupV5 = RemoveDup5(Trans1, Trans2, Time1, Time2, Category, Quantity1, Quantity2, Disc1, Disc2, Price1, Price2);
return(RemoveDupV5)
}
// Price
function RemoveDup6(Trans1, Trans2, Time1, Time2, Category, Quantity1, Quantity2, Disc1, Disc2, Price1, Price2) {
if (Trans1.localeCompare(Trans2) == 0){
if (Time1.localeCompare(Time2) == 0){
return(Price1 + Price2);
}else{
return(Price1)
}
}else{
return(Price1)
}
}
function RDR6(Trans1, Trans2, Time1, Time2, Category, Quantity1, Quantity2, Disc1, Disc2, Price1, Price2){
RemoveDupV6 = RemoveDup6(Trans1, Trans2, Time1, Time2, Category, Quantity1, Quantity2, Disc1, Disc2, Price1, Price2);
return(RemoveDupV6)
}
function clean1() {
var data = SpreadsheetApp.getActive().getActiveSheet().getRange('A2:B11').getDisplayValues();
var res = data.map((x, i, arr) => {
try {
return (x[0] == arr[i + 1][0] && x[1] == arr[i + 1][1]) ? ['', x[1]] : arr[i + 1];
} catch {
}
}).filter(x => x);
res.unshift(data[0])
SpreadsheetApp.getActive().getActiveSheet().getRange(2, 7, res.length, res[0].length).setValues(res);
}
function onOpen(e) {
SpreadsheetApp.getUi()
.createMenu('Clear Dupes')
.addItem('Clear all Dupes', 'clean1')
.addSeparator()
.addToUi();
}
@Tanaike Если вы видите фиктивный лист, вы можете увидеть ожидаемый результат внизу, в основном пустые транзакции имеют одну основную транзакцию над ними. Код должен выводить правильное количество, сумму скидки и цену, складывая все это из пустых транзакций. Это должно прояснить это.
Спасибо за ответ. Из вашего ответа я предложил образец сценария в качестве ответа. Пожалуйста, подтвердите это. Если я неправильно понял ваш вопрос и это было бесполезно, приношу свои извинения.
@Tanaike Пожалуйста, проверьте мой новый комментарий к вашему ответу. Большое спасибо за Вашу помощь!!!*
Спасибо за ответ. О вашем ответе I appreciate your answer, but it is a bit incorrect. Both functions are returning quantities added that are the same name. I have added a new sheet, please check Sheet2 using the same link. In that sheet I have added what need to be done.
For example, G4 is a name under it is a blank, the quantities, price, and discount of that blank need to be added to the G4. Same thing with G7. In G27, there are two blanks below it. The quantities, discounts, and prices of those two blanks need to be added to G27. All of these need to be repeated. I hope this clarifies everything. Thank you!,
Из please check Sheet2 using the same link., когда я увидел предоставленную вами электронную таблицу, я подтвердил, что предоставленный вами образец был значительно изменен. В этом случае мой ответ не может быть использован. Кроме того, я не могу понять ваш фактический ожидаемый результат. Я глубоко извиняюсь, что не мог заметить, что ваши примерные ситуации ввода и вывода отличаются от вашей реальной ситуации. В этом случае я должен удалить свой ответ. Это связано с моим плохим знанием английского языка. Я еще раз глубоко извиняюсь за мое плохое знание английского языка.
Мой плохой, а также. Я пытался объяснить с помощью текста, но это довольно сложно. Ты в полном порядке. Но спасибо за помощь. Просто дайте мне знать, когда вы найдете ответ. Большое спасибо!!!
@Tanaike это было в основном то же самое, но с другими значениями и более уникальными именами/временами. Это просто делает его более реалистичным, чем раньше.
Спасибо за ответ. Я должен извиниться за мое плохое знание английского языка. Я мог бы понять ваш вопрос, но, к сожалению, я все еще не могу понять ваш фактический ожидаемый результат. Таким образом, я все еще не могу придумать решение. Прошу прощения за это. Чтобы понять ваш фактический ожидаемый результат, можете ли вы предоставить примеры входных и выходных ситуаций, которые вы ожидаете от своего фактического ожидаемого результата?
Столбец G: K - это то, что нужно использовать. Колонка M:Q включает несколько примеров того, что я хотел бы. Дайте мне знать, если вам нужна дополнительная помощь. Спасибо!!!
Спасибо за ответ. В вашем фактическом ожидаемом результате примерами входных и выходных ситуаций являются столбцы от «A» до «E» и столбцы от «G» до «K» соответственно. Правильно ли я понимаю?
A:E просто чтобы помочь мне, просто игнорируйте это. G:K - мой образец. M:Q - мой вывод.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Из вашего следующего ответа,
Если вы видите фиктивный лист, вы можете увидеть ожидаемый результат внизу, в основном пустые транзакции имеют одну основную транзакцию над ними. Код должен выводить правильное количество, сумму скидки и цену, складывая все это из пустых транзакций.
Когда используется предоставленная вами электронная таблица, как насчет следующего примера сценария?
Скопируйте и вставьте следующий скрипт в редактор скриптов Google Spreadsheet и сохраните скрипт.
Когда вы используете этот скрипт в предоставленной вами электронной таблице, поместите пользовательскую функцию =SAMPLE(A1:E11) в ячейку. При этом запускается скрипт и возвращаются значения результата.
const SAMPLE = values =>
[...values.reduce((m, r) => {
const [a, , ...c] = r;
if (m.has(a)) {
const [aa, bb, ...cc] = m.get(a);
m.set(a, [aa, bb, ...cc.map((e, i) => e + c[i])]);
} else {
m.set(a, r);
}
return m
}, new Map()).values()];
Когда этот скрипт запускается с предоставленной вами электронной таблицей, получается следующий результат. В этом примере я поместил пользовательскую функцию =SAMPLE(A1:E11) в ячейку «G14». Результат виден в красной цветовой гамме.
Если количество строк велико, использование пользовательской функции может оказаться невозможным. В этом случае запустите скрипт в редакторе скриптов. В это время используйте следующий скрипт.
function myFunction() {
const sheetName = "Sheet1"; // Please set your sheet name.
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
const range = sheet.getDataRange();
const values = [...range.getValues().reduce((m, r) => {
const [a, , ...c] = r;
if (m.has(a)) {
const [aa, bb, ...cc] = m.get(a);
m.set(a, [aa, bb, ...cc.map((e, i) => e + c[i])]);
} else {
m.set(a, r);
}
return m
}, new Map()).values()];
range.clearContent().offset(0, 0, values.length, values[0].length).setValues(values);
}
Из ваших следующих ответов,
но это немного неправильно. Обе функции возвращают добавленные количества с одинаковыми именами. Я добавил новый лист, проверьте Лист2 по той же ссылке. В этом листе я добавил, что нужно сделать. Например, G4 — это имя, под которым находится пробел, количество, цена и скидка которого должны быть добавлены к G4. То же самое с G7. В G27 под ним два пробела. Количество, скидки и цены этих двух заготовок необходимо добавить в G27. Все это нужно повторять. Я надеюсь, что это все проясняет.
A:E просто чтобы помочь мне, просто игнорируйте это. G:K - мой образец. M:Q - мой вывод.
В качестве еще одного примера сценария, как насчет следующего примера сценария?
Скопируйте и вставьте следующий сценарий в редактор сценариев электронной таблицы и сохраните сценарий. И поместите пользовательскую функцию =SAMPLE(Sheet2!G1:K) в ячейку.
const SAMPLE = v =>
v.reduce((o, r, i) => {
const [a, , ...c] = r;
if (a.toString() == "") {
const f1 = o.values[o.temp].splice(0, 2);
o.values[o.temp] = [...f1, ...o.values[o.temp].map((e, j) => e + c[j])];
} else {
o.temp = i;
}
o.values.push(r);
return o;
}, { values: [], temp: -1 }).values;
Если вы хотите напрямую запустить скрипт с помощью редактора скриптов, используйте следующий скрипт.
function myFunction() {
const sheetName = "Sheet2"; // Please set your sheet name.
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
const range = sheet.getRange("G1:K" + sheet.getLastRow());
const { values } = range.getValues().reduce((o, r, i) => {
const [a, , ...c] = r;
if (a.toString() == "") {
const f1 = o.values[o.temp].splice(0, 2);
o.values[o.temp] = [...f1, ...o.values[o.temp].map((e, j) => e + c[j])];
} else {
o.temp = i;
}
o.values.push(r);
return o;
}, { values: [], temp: -1 });
range.offset(0, 6).setValues(values);
}
Из ваших следующих ответов,
ИДЕАЛЬНЫЙ! Но мне нужно значение, где оно пустое/"", мне нужно, чтобы эта строка была удалена. Тогда это совершенно. Я забыл упомянуть об этом. Кроме этого, он работает хорошо.
В качестве еще одного примера сценария, как насчет следующего примера сценария?
Скопируйте и вставьте следующий сценарий в редактор сценариев электронной таблицы и сохраните сценарий. И поместите пользовательскую функцию =SAMPLE(Sheet2!G1:K) в ячейку.
const SAMPLE = v =>
v.reduce((o, r, i) => {
const [a, , ...c] = r;
if (a.toString() == "") {
const f1 = o.values[o.temp].splice(0, 2);
o.values[o.temp] = [...f1, ...o.values[o.temp].map((e, j) => e + c[j])];
} else {
o.temp = i;
}
o.values.push(r);
return o;
}, { values: [], temp: -1 }).values.filter(([a]) => a);
Если вы хотите напрямую запустить скрипт с помощью редактора скриптов, используйте следующий скрипт.
function myFunction() {
const sheetName = "Sheet2"; // Please set your sheet name.
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
const range = sheet.getRange("G1:K" + sheet.getLastRow());
const values = range.getValues().reduce((o, r, i) => {
const [a, , ...c] = r;
if (a.toString() == "") {
const f1 = o.values[o.temp].splice(0, 2);
o.values[o.temp] = [...f1, ...o.values[o.temp].map((e, j) => e + c[j])];
} else {
o.temp = i;
}
o.values.push(r);
return o;
}, { values: [], temp: -1 }).values.filter(([a]) => a);
range.offset(0, 6, values.length, values[0].length).setValues(values);
}
Я ценю ваш ответ, но он немного неверен. Обе функции возвращают добавленные количества с одинаковыми именами. Я добавил новый лист, проверьте Лист2 по той же ссылке. В этом листе я добавил, что нужно сделать. Например, G4 — это имя, под которым находится пробел, количество, цена и скидка которого должны быть добавлены к G4. То же самое с G7. В G27 под ним два пробела. Количество, скидки и цены этих двух заготовок необходимо добавить в G27. Все это нужно повторять. Я надеюсь, что это все проясняет. Спасибо!
@ Gurman3756 Спасибо за ответ. О вашем ответе I appreciate your answer, but it is a bit incorrect. Both functions are returning quantities added that are the same name. I have added a new sheet, please check Sheet2 using the same link. In that sheet I have added what need to be done.
@Gurman3756 For example, G4 is a name under it is a blank, the quantities, price, and discount of that blank need to be added to the G4. Same thing with G7. In G27, there are two blanks below it. The quantities, discounts, and prices of those two blanks need to be added to G27. All of these need to be repeated. I hope this clarifies everything. Thank you!,
@ Gurman3756 Gurman3756 От please check Sheet2 using the same link., когда я увидел предоставленную вами электронную таблицу, я подтвердил, что предоставленный вами образец был в значительной степени изменен. В этом случае мой ответ не может быть использован. Кроме того, я не могу понять ваш фактический ожидаемый результат. Я глубоко извиняюсь, что не мог заметить, что ваши примерные ситуации ввода и вывода отличаются от вашей реальной ситуации. В этом случае я должен удалить свой ответ. Это связано с моим плохим знанием английского языка. Я еще раз глубоко извиняюсь за мое плохое знание английского языка.
@ Gurman3756 Из вашего ответа я добавил еще один пример сценария. Пожалуйста, подтвердите это.
ИДЕАЛЬНЫЙ! Но мне нужно значение, где оно пустое/"", мне нужно, чтобы эта строка была удалена. Тогда это совершенно. Я забыл упомянуть об этом. Кроме этого, он работает хорошо. Спасибо!!!
@ Gurman3756 Спасибо за ответ. О PERFECT! But I need the value where it is blank/"", I need that row to be deleted. Then It is perfect. I forgot to mention that. Other than that, It is working well. Thanks so much!!!, вы хотели удалить, когда значение столбца «G» пусто?
Да. Но количество, скидка и цена должны быть добавлены, именно так, как сейчас.
@ Gurman3756 Из вашего ответа я добавил еще один пример сценария. Пожалуйста, подтвердите это.
Он творит чудеса прямо сейчас! Большое вам спасибо за вашу помощь. Я знаю, как трудно, должно быть, понимать другой язык, но я очень ценю то, что вы все еще пытались и помогали мне на протяжении всего пути. Я всегда буду помнить это. Я надеюсь, что у вас есть благословенный день и жизнь. Еще раз БОЛЬШОЕ СПАСИБО!!!
@ Gurman3756 О It is working wonders right now!, добро пожаловать. Спасибо, что дали мне знать. Я рад, что ваша проблема была решена. Если ваш вопрос был решен, пожалуйста, нажмите кнопку «Принять». Другие люди, у которых есть такая же проблема, как и вы, также могут обосновать ваш вопрос как вопрос, который можно решить. И я думаю, что ваш вопрос и решение будут для них полезны. Если вы не найдете кнопку, не стесняйтесь сказать мне. stackoverflow.com/help/accepted-answer
Я должен извиниться за мое плохое знание английского языка. К сожалению, я не могу понять ваш вопрос. Чтобы правильно понять ваш вопрос, можете ли вы предоставить примеры входных и выходных ситуаций, которые вы ожидаете? Во-первых, хотелось бы правильно понять ваш вопрос.