#javascript #google-apps-script #es6-promise
#javascript #google-apps-script #es6-обещание
Вопрос:
Я работаю в Google Sheets под управлением chrome V8
У меня есть два массива, созданные из данных диапазона на двух разных листах
в реальной ситуации я заранее знаю ширину или длину arr1 или arr2. Все, что я знаю, это то, что они имеют разные размеры
Оба массива имеют Id
столбец. arr1 всегда будет иметь Id
столбец в качестве первого столбца. Я не знаю заранее положение столбца Id
столбца в arr2
arr1 при печати на листе будет выглядеть
Id |Label |SAH1 |SAH2 |SAH3
---------------------------------------
aa1 |Bob |stuff1 |stuff10 |stuff19
aa2 |Eggbert|stuff2 |stuff11 |stuff20
aa3 |Juan |stuff3 |stuff12 |stuff21
aa4 |Alice |stuff4 |stuff13 |stuff22
aa5 |Fraya |stuff5 |stuff14 |stuff23
aa6 |Ted |stuff6 |stuff15 |stuff24
aa7 |Velma |stuff7 |stuff16 |stuff25
aa8 |Carol |stuff8 |stuff17 |stuff26
aa9 |LeRoy |stuff9 |stuff18 |stuff27
arr2 при печати на листе будет выглядеть
Name |SXH1 |Id |SXH2
--------------------------------------------
Maya Townsend |thing1 |mm1 |thing20
David Collste |thing2 |mm2 |thing21
Bob |thing3 |aa1 |thing22
Jennifer Menke |thing4 |mm4 |thing23
Aissata Camara |thing5 |mm5 |thing24
Marta Arranz |thing6 |mm6 |thing25
Michael Lennon |thing7 |mm7 |thing26
Jonny Norton |thing8 |mm8 |thing27
Carol |thing9 |aa8 |thing28
Ted |thing10 |aa6 |thing29
Katie Boone |thing11 |mm11 |thing30
Adeline Sibanda |thing12 |mm12 |thing31
Brian Blankinship|thing13 |mm13 |thing32
Christine Lai |thing14 |mm14 |thing33
Jennifer Pierce |thing15 |mm15 |thing34
Federico Bellone |thing16 |mm16 |thing35
Jeffrey Su |thing17 |mm17 |thing36
Alice |thing18 |aa4 |thing37
Sarah Ditton |thing19 |mm19 |thing38
результат arr при печати на листе должен выглядеть следующим образом
Id |Label |SAH1 |SAH2 |SAH3 |Name |SXH1 |SXH2
------------------------------------------------------------
aa1 |Bob |stuff1 |stuff10 |stuff19 |Bob |thing3 |thing22
aa2 |Eggbert|stuff2 |stuff11 |stuff20 |"" |"" |""
aa3 |Juan |stuff3 |stuff12 |stuff21 |"" |"" |""
aa4 |Alice |stuff4 |stuff13 |stuff22 |Alice|thing18|thing37
aa5 |Fraya |stuff5 |stuff14 |stuff23 |"" |"" |""
aa6 |Ted |stuff6 |stuff15 |stuff24 |Ted |thing10|thing29
aa7 |Velma |stuff7 |stuff16 |stuff25 |"" |"" |""
aa8 |Carol |stuff8 |stuff17 |stuff26 |Carol|thing9 |thing28
aa9 |LeRoy |stuff9 |stuff18 |stuff27 |"" |"" |""
Я искал способ сделать это и не смог найти ничего, что я мог бы изменить
Вот таблица Google с тестовыми данными https://docs.google.com/spreadsheets/d/1y0CFUEdpZ77IgKGVYXUinepg7we2F0311U4D5fAP17Y/edit?usp=sharing
Спасибо
Комментарии:
1. » Я не смог найти ничего, что я мог бы изменить » — так вы ожидаете, что мы представим решение? Пожалуйста, помните, что StackOverflow не является бесплатным сервисом для кодирования. Пожалуйста, сначала попробуйте поработать над своими навыками, попытайтесь найти решение самостоятельно, и когда у вас возникнет конкретный вопрос программирования в ходе этого, тогда мы сможем вам помочь.
2. Если вы не знаете позицию «id» в
arr2
, как вы можете связать значение с правильным «столбцом»? Например, как вы узнаете, какое значение вarr2[0]
соответствует «SXH1»? Кроме того, не могли бы вы подтвердить, какой тип отношения (например, один к одному, один ко многим, многие к одному, многие ко многим) существует междуarr1
иarr2
, пожалуйста?3. Что вы планируете делать со строками, идентификаторы которых не совпадают
4. @Cooper Мне нужно, чтобы добавленные значения строк были пустыми, только совпадающие идентификаторы будут иметь добавленные значения. Я ответил на ваш вопрос?
5. Это не такая уж сложная проблема, вы должны попробовать сами и вернуться, когда у вас возникнут проблемы.
Ответ №1:
Я считаю, что ваша цель и ситуация заключаются в следующем.
- Вы хотите добиться преобразования
result arr
изarr1
иarr2
в свой вопрос с помощью Google Apps Script. - Вы не знаете столбец
Id
вarr2
таблице.
Для достижения вашей цели я хотел бы предложить следующий поток.
- Извлеките значения из 2 исходных листов.
- Создайте объект из значений листа «arr2», используя значения «Id».
- Создайте массив для добавления в таблицу результатов, используя значения листов «arr1» и «arr2».
- Поместите значения в таблицу результатов в таблицу «Результат».
Когда приведенный выше поток отражается в скрипте, он становится следующим.
Пример сценария:
Пожалуйста, задайте имя каждого листа.
function myFunction() {
const arr1SheetName = "arr1";
const arr2SheetName = "arr2";
const resultSheetName = "Result";
const ss = SpreadsheetApp.getActiveSpreadsheet();
// 1. Retrieve values from 2 source sheets.
const [[header1, ...values1], [header2, ...values2]] = [arr1SheetName, arr2SheetName].map(s => ss.getSheetByName(s).getDataRange().getValues());
// 2. Create an object from the values of "arr2" sheet using the values of "Id".
const indexId = header2.indexOf("Id");
const obj = values2.reduce((o, r) => {
const id = r[indexId];
r.splice(indexId, 1);
return Object.assign(o, {[id]: r});
}, {});
// 3. Create an array for putting to the result sheet using the values of "arr1" and "arr2" sheets.
const array = values1.map(r => obj[r[0]] ? r.concat(obj[r[0]]) : r.concat(Array(3).fill("")));
header2.splice(indexId, 1);
array.unshift([...header1, ...header2]);
// 4. Put values to the result sheet to "Result" sheet.
const sheet = ss.getSheetByName(resultSheetName);
sheet.clearContents();
sheet.getRange(1, 1, array.length, array[0].length).setValues(array);
}
- В этом случае из вашей общей электронной таблицы имена листов
arr1
,arr2
иResult
. Пожалуйста, будьте осторожны с этим. - И в этом скрипте, даже когда столбец
Id
inarr2
sheet перемещается, скрипт работает.
Результат:
При использовании этого скрипта получается следующий результат.
От
Для:
Ссылки:
Комментарии:
1. Большое вам спасибо, это работает именно так, как мне было нужно. Я с нетерпением жду вашего ответа
2. Танайке,
Array(3).fill("")
что означает в этой части(3)
?3. @xyz333 Спасибо за ответ. Я рад, что ваша проблема была решена. О
Array(3).fill("")
, он создает массив, включающий 3 элемента как""
.
Ответ №2:
Объединение совпадающих строк
function combineMatchingRows() {
const ss=SpreadsheetApp.getActive();
const sh1=ss.getSheetByName('Sheet1');
const sh2=ss.getSheetByName('Sheet2');
const osh=ss.getSheetByName('Sheet3');//output sheet
const vA1=sh1.getRange(2,1,sh1.getLastRow()-1,sh1.getLastColumn()).getDisplayValues();
const hA1=sh1.getRange(1,1,1,sh1.getLastColumn()).getDisplayValues()[0];
var hObj1={};//columns in sheet1
hA1.forEach((h,i)=>{hObj1[h]=i 1;});
const vA2=sh2.getRange(2,1,sh2.getLastRow()-1,sh2.getLastColumn()).getDisplayValues();
const hA2=sh2.getRange(1,1,1,sh2.getLastColumn()).getDisplayValues()[0];
var hObj2={};//columns in sheet2
hA2.forEach((h,i)=>{hObj2[h]=i 1;});
const id2A=sh2.getRange(2,hObj2['Id'],sh2.getLastRow()-1,1).getValues().flat();//array of ids in sheet2
var vO=[];
vA1.forEach((r,i)=>{
let idx=id2A.indexOf(r[hObj1['Id']-1]);
if(idx!=-1) {
vA2[idx].splice(hObj2['Id']-1,1);//remove second Id column
var row=r.concat(vA2[idx]);
vO.push(row);
}
});
osh.clearContents();
osh.getRange(1,1,vO.length,vO[0].length).setValues(vO);
}
Лист1:
Id,Label,SAH1,SAH2,SAH3
aa1,Bob,stuff1,stuff10,stuff19
aa2,Eggbert,stuff2,stuff11,stuff20
aa3,Juan,stuff3,stuff12,stuff21
aa4,Alice,stuff4,stuff13,stuff22
aa5,Fraya,stuff5,stuff14,stuff23
aa6,Ted,stuff6,stuff15,stuff24
aa7,Velma,stuff7,stuff16,stuff25
aa8,Carol,stuff8,stuff17,stuff26
aa9,LeRoy,stuff9,stuff18,stuff27
Лист2:
Name,SXH1,Id,SXH2
Maya Townsend,thing1,mm1,thing20
David Collste,thing2,mm2,thing21
Bob,thing3,aa1,thing22
Jennifer Menke,thing4,mm4,thing23
Aissata Camara,thing5,mm5,thing24
Marta Arranz,thing6,mm6,thing25
Michael Lennon,thing7,mm7,thing26
Jonny Norton,thing8,mm8,thing27
Carol,thing9,aa8,thing28
Ted,thing10,aa6,thing29
Katie Boone,thing11,mm11,thing30
Adeline Sibanda,thing12,mm12,thing31
Brian Blankinship,thing13,mm13,thing32
Christine Lai,thing14,mm14,thing33
Jennifer Pierce,thing15,mm15,thing34
Federico Bellone,thing16,mm16,thing35
Jeffrey Su,thing17,mm17,thing36
Alice,thing18,aa4,thing37
Sarah Ditton,thing19,mm19,thing38
Лист3 (вывод):
aa1,Bob,stuff1,stuff10,stuff19,Bob,thing3,thing22
aa4,Alice,stuff4,stuff13,stuff22,Alice,thing18,thing37
aa6,Ted,stuff6,stuff15,stuff24,Ted,thing10,thing29
aa8,Carol,stuff8,stuff17,stuff26,Carol,thing9,thing28
Комментарии:
1. Спасибо, я действительно ценю оказанную вами помощь