индексировать текущий столбец в переменной для кода Java script для проекта Google Sheet

#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;          
          }    
        }
}
 

Например, если я наберу 45 на A2 листа 2, то B2 должно быть Paperino, C2 должно быть 3, D2 должно быть agafdh

Извините за плохой английский и заранее благодарю вас.

Ответ №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». Поэтому, если ваша фактическая ситуация отличается от них, пожалуйста, измените их.
  • Поток этого скрипта выглядит следующим образом.
    1. Проверьте, отредактирован ли столбец «A» в «Sheet2».
    2. При редактировании столбца «A» в «Sheet2» извлеките отредактированное значение.
    3. Найдите отредактированное значение из столбца «A» в «Sheet1». В этом случае используется TextFinder.
    4. Скопируйте строку из «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 Спасибо за ответ. Я рад, что ваша проблема была решена. Что касается вашего дополнительного вопроса, я добавил еще один пример сценария. Не могли бы вы подтвердить это, пожалуйста? Если это не тот результат, который вы ожидаете, я прошу прощения.