Скрипт Google Sheets для импорта данных на основе значения ячейки и без дублирования информации

#google-apps-script #google-sheets

#google-apps-script #google-sheets

Вопрос:

Мне нужно извлечь / импортировать данные из «листа 1» в «лист 2» на основе столбца 4, являющегося определенной текстовой строкой. Скрипт не должен извлекать строки, которые уже существуют.

Я понятия не имею, возможно ли это. Я могу извлечь данные, но они просто копируют все, поэтому у меня есть дубликаты.

Любая помощь будет очень признательна.

 function onEdit() {
      var ss = SpreadsheetApp.openById('1Ognzsi6C0DU_ZyDLuct58f5U16sshhBpBoQ8Snk8bhc');
      var sheet = ss.getSheetByName('Sheet 1'); 
      var testrange = sheet.getRange('D:D');
      var testvalue = (testrange.getValues());
      var sss = SpreadsheetApp.getActive();
      var csh = sss.getSheetByName('Sheet 1');
      var data = [];
      var j =[];
    
      
    for (i=0; i<testvalue.length;i  ) {
      if ( testvalue[i] == 'Dan') {
      data.push.apply(data,sheet.getRange(i 1,1,1,11).getValues());
      
      j.push(i);
      }
     }
    
     csh.getRange(csh.getLastRow() 1,1,data.length,data[0].length).setValues(data);
    
}
  

Комментарии:

1. Могу я задать вам ваш вопрос? 1. Как вы хотите запустить скрипт? В вашем скрипте onEdit() используется. Но простой триггер не может использоваться openById . 2. Можете ли вы предоставить образец ввода и вывода, который вы ожидаете?

2. Я могу соответствовать автоматически, что было бы удивительно. в противном случае, я в порядке, просто запустив его, я мог бы создать пользовательский пункт меню. Спасибо, что посмотрели на него

3. Спасибо за ответ. Из вашего ответа я понял, что вы хотите запустить скрипт из пользовательского меню. В качестве дополнительной информации можете ли вы предоставить пример ввода и вывода, которые вы ожидаете, чтобы правильно понять ваш вопрос?

4. Я бы создал пользовательское меню с функцией импорта, чтобы перенести нужные мне данные с листа 1 на листы 2 на основе выбора в столбце 4. Таким образом, все, что назначено Дэну, будет отправлено на лист 2. Я надеюсь, что это поможет еще раз спасибо

5. Спасибо за ответ. Я заметил, что ответ уже опубликован. Я хотел бы уважать существующий ответ. Я думаю, что это решит вашу проблему.

Ответ №1:

Решение

Вы должны быть в состоянии заменить свой код этим, и он будет работать. Вы должны поместить этот скрипт на целевой лист (Лист 2) и заменить идентификатор в первой строке функции на источник (лист 1).

Я оставлю это на ваше усмотрение, чтобы изменить onEdit или, чтобы сделать его пунктом меню. Прямо сейчас его можно запустить из редактора сценариев. onEdit для меня это не имеет смысла в качестве подходящего триггера. Возможно, вы предпочитаете триггер, управляемый временем. Хотя пользовательское меню было бы лучшим способом IMO.

 function pullData() {
    var sourceSs = SpreadsheetApp.openById('[YOUR_SPREADSHEET_ID]');
    var sourceRange = sourceSs.getSheetByName('Sheet1').getDataRange();
    var sourceHeight = sourceRange.getHeight();
    var sourceWidth = sourceRange.getWidth();
    var sourceData = sourceSs.getSheetByName('Sheet1').getRange(2, 1, sourceHeight - 1, sourceWidth).getValues();

    var targetSs = SpreadsheetApp.getActive();
    var targetRange = targetSs.getSheetByName('Sheet1').getDataRange();
    var targetHeight = targetRange.getHeight();
    var targetWidth = targetRange.getWidth();

    var sourceDataChecker = [];
    var targetDataChecker = [];

    sourceData.forEach((row) => {
        sourceDataChecker.push(row[0]   row[1]   row[2]   row[3]);
    })

    if (targetHeight != 1) {
        var targetData = sourceSs.getSheetByName('Sheet1').getRange(2, 1, targetHeight - 1, targetWidth).getValues();
        targetData.forEach((row) => {
            targetDataChecker.push(row[0]   row[1]   row[2]   row[3]);
        });
    };

    sourceData.forEach((row, i) => {
        if (!(targetDataChecker.includes(sourceDataChecker[i]))) {
            targetSs.appendRow(row);
        };
    });
}
  

Объяснение

Этот скрипт создает «индекс» каждой строки в обоих листах путем объединения всех значений в строке. Я сделал это, потому что заметил, что иногда у вас есть «joe» в двух строках, и поэтому вы не можете просто использовать столбец 4 в качестве своего индекса. В основном вы проверяете наличие любой строки, отличной от строки на целевом листе (лист 2).

Если целевой лист пуст, то копируются все строки.

Список литературы

Комментарии:

1. Большое вам спасибо за это, похоже, он работает, но извлекает все данные, а не только одну строку с определенной текстовой строкой. Я обновил эту часть своей текстовой строкой var sourceDataChecker = []; var targetDataChecker = [];

2. В принципе, я хочу сделать так, чтобы все записи одного человека попадали на их лист

3. Я немного смущен, извините. Вы говорите, что вам нужна только одна строка с определенной текстовой строкой в столбце 4 (столбец D), например «joe», верно? Тем не менее, в вашем примере (лист 1) есть две строки со значением «joe» — так как же скрипт должен знать, какую из них извлекать? Например, есть также «Dan» и «dan». Не могли бы вы прояснить это для меня?

4. извините за путаницу. Если в строке указано dan, я хочу, чтобы он перенес эту строку на лист, но не вытягивал остальные. Затем по мере добавления дополнительных строк, если они говорят, что dan, они будут вытягиваться, но не будут вытягивать ранее извлеченные, поэтому дубликатов не будет

5. Спасибо, пожалуйста, просто подтвердите еще 3 вещи: Можете ли вы подтвердить, что хотите извлекать только самую последнюю строку? Или, если в двух или более строках есть «Dan» — как вы узнаете, какую из них выбрать? С даты? С какого низкого уровня он находится на листе? Можете ли вы подтвердить, что хотите, чтобы самая последняя строка заменяла строку в «Листе 2»? Чтобы у вас всегда была только одна строка для «Dan» или «Joe». Это правильно? Вы хотите различать «dan» и «Dan» или это одно и то же? Не могли бы вы обновить свой первоначальный вопрос с помощью этой информации, спасибо.