Сопоставьте значения из одного списка с другим на другом листе и скопируйте одну ячейку GAS - PullRequest
0 голосов
/ 19 февраля 2019

нужна помощь по сценарию, который не работает в сценарии приложения Google.У меня есть sheet1, где colA - это дата, а colB - это идентификатор.На листе 2 у меня такой же идентификатор, но он может быть в любой строке (не по порядку).Таким образом, скрипт должен найти этот идентификатор и скопировать на столбец col P (лист2) дату на столбец colA (лист1).Здесь сценарий, который ничего не делает.Заранее благодарю за любую помощь.

function CopyDate() {
  ss = SpreadsheetApp.openById('Name');
  sheetA = ss.getSheetByName('Sheet1');
  dataA = sheetA.getRange('A:B').getValues();
  sheetB = ss.getSheetByName('Sheet2');
  dataB = sheetB.getRange('A:P').getValues();
  for(var i = 0; i > sheetA.getLastRow(); i++) {
    if (dataA[2][i] == dataB[1][i]) {
      var value = sheetA.getRange(i+1, 1).getValue();
      sheetB.getRange(i+1, 16).setValue(value);
    }
  }
}

1 Ответ

0 голосов
/ 20 февраля 2019
  • «Лист1» имеет дату и идентификатор в столбцах «А» и «В» соответственно.
  • «Лист2» ​​имеет идентификатор в столбце «А».
  • Вы хотите скопировать дату «Sheet1» в столбец «P» «Sheet2», когда идентификаторы «Sheet1» и «Sheet2» совпадают.
  • Вы хотите добиться этого с помощью скрипта Google Apps.

Если мое понимание верно, как насчет этой модификации?

Точки модификации:

  • О for(var i = 0; i > sheetA.getLastRow(); i++){, в данном случае цикл forне используется, потому что i > sheetA.getLastRow().
  • dataA и dataB являются 2-х мерными массивами типа [[columnA of row1, columnB of row1],[columnA of row2, columnB of row2],,,].Таким образом, в dataA[2][i] == dataB[1][i] сравниваются строка 2 в Sheet1 и строка 1 в Sheet2.
  • Когда в цикле используется setValue(), стоимость становится очень высокой.Поэтому, пожалуйста, поместите значения, используя setValues() после создания значения для размещения.
  • В вашем случае, когда используется var dataA = sheetA.getRange(1, 1, sheetA.getLastRow(), 2).getValues() вместо sheetA.getRange('A:B').getValues(), стоимость процесса может быть уменьшена.

Когда вышеуказанные точки отражаются в вашем скрипте, он становится следующим:

Модифицированный скрипт:

function CopyDate() {
  var ss = SpreadsheetApp.openById('Name'); // If you want to use openById(), please replace the Spreadsheet ID to ``Name``.
  var sheetA = ss.getSheetByName('Sheet1');
  var dataA = sheetA.getRange(1, 1, sheetA.getLastRow(), 2).getValues();
  var sheetB = ss.getSheetByName('Sheet2');
  var dataB = sheetB.getRange(1, 1, sheetB.getLastRow(), 1).getValues();
  var values = dataB.map(function(e) {
    var t = dataA.filter(function(f) {return f[1] == e[0]});
    return t.length > 0 ? [t[0][0]] : [""];
  });
  sheetB.getRange(1, 16, values.length, 1).setValues(values); // 16 means the column "P".
}

Примечание:

  • В вашем скрипте:Name можно увидеть в ss= SpreadsheetApp.openById( 'Name');.Если вы используете имя таблицы, пожалуйста, используйте идентификатор таблицы.Если я неправильно понял это, пожалуйста, игнорируйте.
  • Если вы не хотите снижать стоимость процесса, я приношу свои извинения.

Ссылки:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...