#google-apps-script #google-sheets #scripting
Вопрос:
Я пытаюсь перенести информацию с одного листа на другой на основе имен сотрудников из центральной базы данных.
Я попытаюсь объяснить проблему здесь с помощью фотографий, и я свяжу листы внизу.
«Именной лист 1» содержит список имен сотрудников, а также то, что они ели сегодня на завтрак, сегодня на обед, любимую еду, любимую газировку, любимый цвет и любимое животное.
Имена были внесены в «Именной лист 1» на основе даты их присоединения к компании. «Именной лист 2» Содержит ту же информацию, однако имена теперь вводятся в зависимости от их возраста, поэтому имена расположены в другом порядке.
Столбцы B и C обновляются автоматически каждый день из другой базы данных, но столбцы A, D-G не меняются. Вся информация листа в столбцах A-C перезаписывается каждый день, однако они всегда будут в одном и том же порядке, поэтому D-G не обновляйте, так как они не изменятся, если сотрудник не будет добавлен/ удален, что будет сделано вручную.
Теперь, когда мы переходим к «Именному листу 2», я пытаюсь переместить все данные из «Именного листа 1» на этот новый лист.
Я пытаюсь написать сценарий, который будет искать имя сотрудника в «Именном листе 2», копировать данные для столбцов D-G для этого сотрудника в «Именном листе 1» и вставлять эту информацию в столбцы D-G для этого сотрудника в «Именном листе 2»
Например, В «Именном листе 1» мы видим, что Боб-это строка 2, но строка 4 в «Именном листе 2». Этот скрипт найдет Боба в «Листе имени 1», Скопирует D2:G2, затем найдет столбец A в «Листе имени 2» для «Боба», и когда он найдет «Боб» в формате А4, он вставит его в D4.
Мне удалось найти сценарии, которые могут выполнять поиск на листе и печатать информацию на другом листе, однако я не нашел ни одного для поиска на этом втором листе и копирования/вставки определенной информации. Вот код для этой функции поиска
var SPREADSHEET_NAME = "Name Sheet1";
var SEARCH_COL_IDX = 1;
var RETURN_COL_IDX = 0;
function searchStr(str) {
var values = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SPREADSHEET_NAME).getDataRange().getValues();
for (var i = 0; i < values.length; i ) {
var row = values[i];
if (row[SEARCH_COL_IDX] == str) {
return row[RETURN_COL_IDX];
}
}
}
Именной лист 2: https://docs.google.com/spreadsheets/d/1j6wt-ZDwnuXUf6Z3alyjUInuV2PHTdOweGf2L_JkxJ8/edit?usp=sharing
Комментарии:
1. Какой сценарий вы пытались написать, который не сработал?
2. Привет, Дмитрий, До сих пор я делал скрипт только для поиска по первому листу/столбцу и получения информации из строки, но не смог найти, как выполнить поиск по второму листу, а затем вставить.
var SPREADSHEET_NAME = "Name Sheet1"; var SEARCH_COL_IDX = 1; var RETURN_COL_IDX = 0; function searchStr(str) { var values = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SPREADSHEET_NAME).getDataRange().getValues(); for (var i = 0; i < values.length; i ) { var row = values[i]; if (row[SEARCH_COL_IDX] == str) { return row[RETURN_COL_IDX]; } } }
Ответ №1:
function copyDG() {
const ss = SpreadsheetApp.getActive();
const sh1 = ss.getSheetByName('Names Sheet 1');
const rg1 = sh1.getRange(2,1,sh1.getLastRow() - 1);
const vs1 = rg1.getDisplayValues();
const sh2 = ss.getSheetByName('Names Sheet 2');
const rg2 = sh2.getRange(2,1,sh2.getLastRow() - 1);
const vs2 = rg2.getDisplayValues().flat();
vs1.forEach((r,i) => {
let idx = vs2.indexOf(r[0]);
if(~idx) {
sh1.getRange(i 2,4,1,4).copyTo(sh2.getRange(idx 2,4));
}
});
}
Ответ №2:
Вы можете легко сделать это с помощью операторов VLOOKUP в ячейках, и не обязательно с помощью сценария. Формула VLOOKUP получит строку поиска (имя) из столбца A текущего листа, затем перейдет на лист 1 и найдет эту строку, а затем получит значение из соответствующего столбца.
Например, добавление формулы VLOOKUP в ячейку D2 (Любимая еда, для Грега) —
Формула будет ссылаться на строку поиска Грега ($A2) , будет искать Лист1 для этой строки (Лист1!$A:$G), вернет значение этой строки в столбце D (4), а затем установит флаг «is_sorted» (обычно устанавливается значение false):
Ту же формулу можно использовать для столбцов E,F,G, заменив 4 на 5, 6 или 7 в зависимости от того, из какого столбца его извлекать.
(Вы, конечно, могли бы также использовать одну и ту же формулу для всех столбцов B-G, а не только для D-G. )
Комментарии:
1. ОП, вероятно, включил бы тег Google-Формулы, если бы это было то, что им нужно.