#javascript #google-apps-script #google-sheets
#javascript #google-apps-script #google-sheets
Вопрос:
Я только начал изучать javascript и пытаюсь сделать что-то вроде этого:
У меня есть 2 разных листа, Лист1 содержит некоторые данные, а Лист2 пуст. Лист1 содержит числа в столбце A и некоторые данные в других столбцах.
Я пытался создать скрипт, который запускается, когда я вменяю целое число в столбец A листа 2 (которое должно быть уникальным на этом листе и присутствовать в столбце A листа 1), и если оно равно номеру столбца A листа 1, то скрипт должен скопировать соответствующую строку таблицы.С листа 1 на Лист2.
Чего я добился, это что-то вроде этого:
function votazioni() {
var spreadsheet = SpreadsheetApp.getActive();
var activeSheet= spreadsheet.getActiveSheet();
var baseDati= spreadsheet.getSheetByName("Foglio2");
var cellRange = activeSheet.getActiveCell();
var imput= activeSheet.getActiveCell().getValue();
var indiceImput= cellRange.getColumn();
var copiaDati=baseDati.getActiveRange(1,indiceImput).getValue();
for (var i=1; i<1204; i ){
if (imput == copiaDati) {
for( var j=2; j<7; j ){
var copiaValore=baseDati.getRange (j,indiceImput).getValue();
activeSheet.getRange(j,indiceImput).setValue(copiaValore);
}
i=1204;
}
}
}
Извините за плохой английский и заранее благодарю вас.
Ответ №1:
Я считаю, что ваша цель заключается в следующем.
- Когда
45
он помещается в ячейку «A2» «Листа 2», вы хотите выполнить поиск значения45
из столбца «A» «Листа 1» и скопировать искомую строку в «Лист2». - Вы хотите добиться этого с помощью Google Apps Script.
Точки модификации:
- В вашем скрипте
imput
иcopiaDati
сравниваются. Но, похоже, что столбец «A» из «Sheet1» не сканируется. - В этом случае я подумал, что триггер onEdit может подойти для достижения вашей цели. При использовании триггера onEdit при редактировании столбца «A» в «Sheet2» скрипт может быть запущен автоматически. Я подумал, что эта ситуация может быть полезна для вашей ситуации.
Вышеуказанные пункты отражаются в скрипте, он становится следующим.
Пример сценария:
Пожалуйста, скопируйте и вставьте следующий скрипт в редактор сценариев Google Spreadsheet. И, пожалуйста, отредактируйте столбец «A» в «Sheet2». При этом запускается скрипт, и введенное значение ищется из столбца «A» в «Sheet1» и копирует строку в «Sheet2».
function onEdit(e) {
const range = e.range;
const sheet = range.getSheet();
if (sheet.getSheetName() != "Sheet2" || range.getColumn() != 1 || range.getRow() == 1) return;
const value = range.getValue();
const srcSheet = e.source.getSheetByName("Sheet1");
const srcRange = srcSheet.getRange("A2:A" srcSheet.getLastRow()).createTextFinder(value).matchEntireCell(true).findNext();
if (srcRange) {
srcRange.offset(0, 1, 1, srcSheet.getLastColumn() - 1).copyTo(range.offset(0, 1));
}
}
- В этом примере сценария, исходя из вашего вопроса, используются имена листов «Sheet1» и «Sheet2». Поэтому, если ваша фактическая ситуация отличается от них, пожалуйста, измените их.
- Поток этого скрипта выглядит следующим образом.
- Проверьте, отредактирован ли столбец «A» в «Sheet2».
- При редактировании столбца «A» в «Sheet2» извлеките отредактированное значение.
- Найдите отредактированное значение из столбца «A» в «Sheet1». В этом случае используется TextFinder.
- Скопируйте строку из «Sheet1» в «Sheet2».
Примечание:
- В этом скрипте для достижения вашей цели используется триггер onEdit простого триггера. Поэтому, когда вы напрямую запускаете функцию
onEdit
в редакторе сценариев, возникает ошибка. Пожалуйста, будьте осторожны с этим. При запуске скрипта отредактируйте столбец «A» в «Sheet2». - Если вы хотите вручную запустить скрипт для активной ячейки, вы также можете использовать следующий скрипт. В этом случае вы можете запустить скрипт в редакторе сценариев.
function myFunction() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getActiveSheet(); const range = sheet.getActiveCell(); if (sheet.getSheetName() != "Sheet2" || range.getColumn() != 1 || range.getRow() == 1) return; const value = range.getValue(); const srcSheet = ss.getSheetByName("Sheet1"); const srcRange = srcSheet.getRange("A2:A" srcSheet.getLastRow()).createTextFinder(value).matchEntireCell(true).findNext(); if (srcRange) { srcRange.offset(0, 1, 1, srcSheet.getLastColumn() - 1).copyTo(range.offset(0, 1)); } }
Ссылки:
Добавлено:
О вашем дополнительном вопросе следующим образом.
можно ли избежать двойных значений в столбце A листа 2?
Пример сценария выглядит следующим образом.
Пример сценария:
В этом случае onEdit
значение mofidied. При использовании этого скрипта, пожалуйста, введите значение в столбец «A» из «Sheet2». В этом случае, когда значение put существует в столбце «A» «Листа 2», значение put удаляется. С другой стороны, когда введенное значение НЕ существует в столбце «A» в «Sheet2», значение put ищется из столбца «A» в «Sheet1» и копируется строка.
function onEdit(e) {
const range = e.range;
const sheet = range.getSheet();
if (sheet.getSheetName() != "Sheet2" || range.getColumn() != 1 || range.getRow() == 1) return;
const value = range.getValue();
const values = sheet.getRange("A2:A" sheet.getLastRow()).getValues();
values.splice(range.getRow() - 2, 1);
if (values.flat().includes(value)) {
range.clearContent();
return;
}
const srcSheet = e.source.getSheetByName("Sheet1");
const srcRange = srcSheet.getRange("A2:A" srcSheet.getLastRow()).createTextFinder(value).matchEntireCell(true).findNext();
if (srcRange) {
srcRange.offset(0, 1, 1, srcSheet.getLastColumn() - 1).copyTo(range.offset(0, 1));
}
}
- Если вы не хотите удалять значение put в «Sheet2», когда значение существует, пожалуйста, удалите
range.clearContent();
.
Комментарии:
1. Спасибо, все работает нормально. lol Я потратил последние 6 часов, чтобы написать что-то, что вообще не работает…. можно ли избежать двойных значений в столбце A листа 2? Прямо сейчас я действительно не понимаю большую часть вашего кода, но я начал искать некоторые вещи, такие как смещение.
2. @Toni900V Спасибо за ответ. Я рад, что ваша проблема была решена. Что касается вашего дополнительного вопроса, я добавил еще один пример сценария. Не могли бы вы подтвердить это, пожалуйста? Если это не тот результат, который вы ожидаете, я прошу прощения.