Google Таблицы — Двусторонняя синхронизация с «Главного» на «Поездку 1″, Поездку 2» и т. Д

#google-apps-script #google-sheets

Вопрос:

@Tanaike очень любезно предоставил этот измененный код, который отлично работает, так что, когда я добавляю уникальный номер в диапазоне «A2:A» на листе «Мастер», он обновляет диапазон «A4:A» на всех остальных листах «Поездка 1», «Поездка 2» и т. Д.

Я также хотел бы, чтобы произошло обратное, чтобы, когда я удаляю один из уникальных номеров в «A2:A» на листе «Мастер», он удалял один и тот же уникальный номер в «A4:A» на каждом из листов «Поездка 1», «Поездка 2» и т. Д.

Если бы кто-нибудь мог оказать некоторую помощь, я был бы очень признателен.

 function updateSheet() {
  Array.prototype.showDif = function (array) {
    let that = this;
    return array.filter(function (r) {
      return !that.some(function (x) {
        return r.join() === x.join();
      })
    })
  }

  let ss = SpreadsheetApp.getActive()
  let sourceValues = ss.getSheetByName("Master").getRange("A2:A").getValues().filter(String);
  const sheetNames = [ "Trip 1", "Trip 2", "Trip 3", "Trip 4", "Trip 5", "Trip 6", "Trip 7", "Trip 8", "Trip 9", "Trip 10"];
  sheetNames.forEach(name => {
    let targetSheet = ss.getSheetByName(name);
    if (!targetSheet) return;
    let targetRange = targetSheet.getRange("A4:A");
    let targetValues = targetRange.getValues().filter(String)
    let diff = targetValues.showDif(sourceValues)
    targetRange.clearContent();
    targetValues = (diff amp;amp; diff.length) ? targetValues.concat(diff) : targetValues;
    targetSheet.getRange(4, 1, targetValues.length, targetValues[0].length).setValues(targetValues)
  });
}
 

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

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

Ответ №1:

Вы можете просто скопировать свою колонку » А » после любых изменений:

 function copy_data() {
  var ss    = SpreadsheetApp.getActiveSpreadsheet();
  var sh    = ss.getSheets()[0];
  var data  = sh.getRange('A2:A').getValues();
  var names = ["Trip 1", "Trip 2", "Trip 3"];

  for (var name of names) {
    var sheet = ss.getSheetByName(name);
    if (!sheet) continue;
    sheet.getRange('A4:A').clearContent();
    sheet.getRange(4, 1, data.length).setValues(data);
  }
}
 

На всякий случай, вот функция, которая обновляет столбцы (добавляет новые значения и удаляет удаленные) на других листах и сохраняет порядок элементов в целевых столбцах:

 function update_column_keep_order() {
  var ss       = SpreadsheetApp.getActiveSpreadsheet();
  var sh       = ss.getSheets()[0];
  var src_data = sh.getRange(`A2:A${sh.getLastRow()}`).getValues().flat();
  var names    = ["Trip 1", "Trip 2", "Trip 3"];

  for (var name of names) {
    var sheet = ss.getSheetByName(name);
    if (!sheet) continue;

    var dest_data = sheet.getRange(`A4:A${sheet.getLastRow()}`).getValues().flat();
    var map = new Map(dest_data.map(x => ['' x,x]));

    // add all values from source range to destination range
    for (var key of src_data) if (key !='') map.set('' key, key); 

    // clear the values in destination range that absent in source range
    var diffs = src_data.dif(dest_data);
    for (var dif of diffs) map.set(''   dif, '');
    var updated_dest_data = Array.from(map.values()).map(x => [x]);

    // put the values in destinaion range on the sheet
    sheet.getRange('A4:A').clearContent();
    sheet.getRange(4, 1, updated_dest_data.length).setValues(updated_dest_data);
  }
}

// based on Tanaike's solution
Array.prototype.dif = function (array) {
  return array.filter(r => !this.some(x => r === x))
}
 

Значения в столбце » А » должны быть уникальными.

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

1. Большое спасибо за вашу помощь и предоставление вышеуказанных решений. Я попытался использовать вашу » функцию update_column_keep_order ()», но, похоже, она работает не так, как предполагалось. Когда я добавляю уникальный номер в colA на листе «Мастер» и запускаю скрипт, он не добавляет уникальный номер в colA на листе «Поездка 1». Он добавил колУ с листа «Резюме» на лист «Поездка 1». Ниже приведена ссылка на файл Google sheet: docs.google.com/spreadsheets/d/… Еще раз большое спасибо @Юрий Христич за вашу помощь.

2. Поскольку у меня не было вашего настоящего листа, я использовал только первый лист в качестве «Мастера». Конечно, тебе пришлось это изменить. Это всего лишь одна строчка: var sh = ss.getSheets()[0]; чтобы var sh = ss.getSheetByName('Master');