Запрос (Importrange) со вставкой необходимых строк во избежание перезаписи данных

Я хотел бы разработать сценарий, который позволяет применять ту же функцию в столбце A, обращаясь ко всем строкам ниже (от A1 до A600), что является запросом (Importrange), для которого количество вставляемых строк не фиксировано ( от 1 до 300), поэтому его необходимо вставить перед копированием данных.

Я начал с разработки формулы в ячейке A1, которая работает очень хорошо, но подразумевает копирование блока 600 раз в ячейку, чтобы охватить все строки:

`={Query(IMPORTRANGE('Master Table Projects'!T503,"Impacted Formula!A5:R1000"),"where Col1 is not Null");Query(IMPORTRANGE('Master Table Projects'!T467,"Impacted Formula!A5:R1000"),"where Col1 is not Null");Query(IMPORTRANGE('Master Table Projects'!T15,"Impacted Formula!A5:R1000"),"where Col1 is not Null")}

Как следствие, мне нужно разработать сценарий с циклом, чтобы посмотреть, как применить эту формулу от T1 до T600. Я пробовал это:

function myFunction() {
var ui = SpreadsheetApp.getUi();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var rangeData = sheet.getDataRange();
var lastColumn = rangeData.getLastColumn();
var lastRow = rangeData.getLastRow();
var searchRange = sheet.getRange(2,2, lastRow-1, lastColumn-1);
  for (r=1; r<100;r++) {
    var sa=(Query(IMPORTRANGE('Master Table Projects'!Tr,"Impacted Formula!A5:R1000"),"where Col1 is not Null")); 
   ss.getRange(r,1).setValue(sa); 
  };

Это не работает, так как я получаю предупреждающее сообщение: SyntaxError: missing) после списка аргументов (строка 19, файл Learnings.gs)

Я совсем не эксперт в программировании, но: я полагаю, что моя var sa не настроена должным образом, но я не знаю, как ее исправить. Tr для меня означает от T1 до T600, но, скорее всего, это плохо написано.

Прилагаю изображение результатов, которые я хотел бы получить: ожидаемые результаты

Добавив строку кода, предложенную @ziganotschka

sheet.getRange("A" + sheet.getLastRow()).setValue(sa);

Я получил результаты, прикрепленные к новому изображению, что является хорошим улучшением, потому что отображаются только импортированные строки, в которых есть некоторые результаты для отображения, но: По-прежнему существует проблема перекрытия импортированных данных. И последнюю строку (которая соответствует T999) необходимо удалить вручную, чтобы увидеть некоторые результаты. улучшенный макрос

Если вы нажмете ссылку в таблице, я могу предоставить вам доступ позже, но я не могу поделиться общедоступной ссылкой из-за ограничений моей компании (эта опция заблокирована).

Не могли бы вы помочь мне, исправив эти строки, чтобы они работали?

Благодаря @ziganotschka вот рабочий код:

  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var limit = ss.getSheetByName('Master Table Projects').getRange("T2").getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
  Logger.log(limit);
  for (var r=2; r<=limit; r++) { 
    var sa="=Query(IMPORTRANGE('Master Table Projects'!T"+r+',"Impacted Formula!A5:R1000"),"where Col1 is not Null")'; 
    var firstEmptyRow = sheet.getRange("A1").getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow()+1;
      Logger.log(firstEmptyRow);
    sheet.getRange("A" + firstEmptyRow).setValue(sa);
    SpreadsheetApp.flush();
  }
}

Большое спасибо Иса


person Isabelle    schedule 03.07.2020    source источник
comment
Прежде чем помочь вам с частью сценария, нужно понять вашу формулу. Синтаксис для IMPORTRANGE - =IMPORTRANGE(spreadsheet_url, range_string), но я не вижу url в вашей формуле.   -  person ziganotschka    schedule 03.07.2020
comment
Основные проекты таблиц - это вкладка в том же листе Google   -  person Isabelle    schedule 05.07.2020
comment
Решает ли проблему решение с getLastRow(), как указано в комментарии к моему ответу? В противном случае предоставьте доступ к протоколу образцов.   -  person ziganotschka    schedule 08.07.2020
comment
@ziganotschka Я обновил свой вопрос улучшениями, внесенными вашим решением с помощью getLastRow (), но это не решает проблему перекрытия данных из строки в другую   -  person Isabelle    schedule 09.07.2020
comment
Как уже упоминалось, мне нужно будет взглянуть на вашу электронную таблицу, включая данные в Master Table Projects и Impacted Formula, чтобы найти решение для вашего случая.   -  person ziganotschka    schedule 09.07.2020
comment
не могли бы вы перейти по ссылке, и я дам вам доступ?   -  person Isabelle    schedule 09.07.2020
comment
Вы видели обновленный ответ?   -  person ziganotschka    schedule 13.07.2020
comment
Я видел, что вы создали myFunction3 (), который передает в ячейку A2 все импортированные диапазоны до r = 5, поскольку код говорит r ‹6. Это означает, что цикл не смотрит на последнюю активную строку, которая может быть строкой 3 или строкой 600 с реальным файлом (здесь я поделился с вами небольшим примером с 3 строками, на которые следует обратить внимание). Как вы думаете, есть ли способ, чтобы r ‹10000, но цикл останавливался, если, например, после строки 7 ничего нет?   -  person Isabelle    schedule 13.07.2020
comment
Другое дело, что если среди импортированных диапазонов один файл не заполнен или отсутствует, возможно ли создать строку с NA? В настоящее время, если один файл не может быть импортирован, то в ячейке A2 ничего не отображается с напечатанной ошибкой, поскольку вся функция отображается в ячейке A2.   -  person Isabelle    schedule 13.07.2020
comment
Было бы здорово иметь в ячейке A2 импортированный диапазон T2 с необходимыми строками для импорта, в следующей доступной ячейке A3 (или A ›3, если несколько строк были добавлены с T2) импортированный диапазон T3 с количеством строки, необходимые для этого импорта и т. д. И если T4 пуст, то либо иметь NA во всех ячейках, либо пропустить этот импорт, чтобы перейти к T5 и вставить то, что необходимо.   -  person Isabelle    schedule 13.07.2020
comment
Я вижу, я обновил свой ответ, предоставив вам два рабочих решения для вашего случая, реализующих динамический поиск последней записи в столбце T. Это должно решить вашу проблему.   -  person ziganotschka    schedule 13.07.2020
comment
Большое спасибо. Я попробовал myFunction3 (), и это работает очень хорошо, если все файлы в Tx верны. Но если один файл отсутствует, вся формула останавливается и #VALUE! появляется. Я добавил несколько строк в главную таблицу: только строка 6 не содержит правильный файл, все остальные, включая строку 7, содержат файлы для импорта.   -  person Isabelle    schedule 13.07.2020
comment
При попытке использовать myFunction4 () на странице ничего не отображается.   -  person Isabelle    schedule 13.07.2020
comment
Он работал раньше и снова работает после того, как я удалил 1000 пустых строк, которые по какой-то причине были на листе сейчас. Убедитесь, что вы очистили пустые строки перед запуском скрипта (вы также можете выполнить dit программно, как показано здесь). Кроме того, измените структуру данных sheet.getRange("A2").getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow()+1; на sheet.getRange("A1").getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow()+1;   -  person ziganotschka    schedule 13.07.2020
comment
@ziganotschka большое спасибо за ваше объяснение. Я не на работе на несколько дней, проверю, когда вернусь в субботу. Я хотел бы сердечно поблагодарить вас за вашу помощь до сих пор.   -  person Isabelle    schedule 15.07.2020
comment
Рад помочь вам! Для целей документации, если можете, примите ответ (✓), который был вам полезен - он поможет другим людям, у которых в будущем возникнет такая же проблема, найти решение :)   -  person ziganotschka    schedule 15.07.2020
comment
@ziganotschka Подтверждаю, что myFunction4 () работает отлично. Спасибо!   -  person Isabelle    schedule 10.08.2020
comment
Я действительно хотел бы удалить все строки перед запуском макроса, независимо от того, что у них есть, или они пусты, поэтому я попытался использовать общую ссылку, но получил сообщение об ошибке: ReferenceError: диапазон не определен   -  person Isabelle    schedule 10.08.2020


Ответы (1)


Предположим, у вас есть рабочая формула, чтобы присвоить ей динамический индекс строки, вам необходимо правильно объединить ее:

  • Когда вы создаете свою переменную sa, она может состоять из ссылок на другие переменные и текста.
  • Текст необходимо обозначить как строку, заключив = t в одинарные или двойные кавычки.
  • Если текст (формула) уже содержит некоторые кавычки, не забудьте адаптировать внешние кавычки, чтобы обеспечить чередование одинарных (') и двойных (") кавычек или escape-кавычек - см. здесь
  • Для формул = должно быть частью текста.
  • Чтобы объединить текстовую часть и ссылку на переменную, используйте знак +
  • Ваша IMPORTRANGE формула может возвращать пустые строки, вам придется запрашивать следующую свободную строку каждый раз, когда вы устанавливаете новую формулу.
  • Для этого полезен метод getNextDataCell ()

Образец:

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var limit = ss.getSheetByName('Master Table Projects').getRange("T2").getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
  for (var r=2; r<=limit; r++) { 
    var sa="=Query(IMPORTRANGE('Master Table Projects'!T"+r+',"Impacted Formula!A5:R1000"),"where Col1 is not Null")'; 
    var firstEmptyRow = sheet.getRange("A2").getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow()+1;
    sheet.getRange("A" + firstEmptyRow).setValue(sa);
    SpreadsheetApp.flush();
  }
}

Примечания:

  • Не рекомендуется использовать setValue() в каждой отдельной строке, на будущее подумайте о сохранении запросов в массиве и внесите после выхода из цикла for все значения в одну таблицу с setValues ​​()
  • Дважды проверьте правильность формулы (IMPORTRANGE ожидает URL-адрес электронной таблицы)

Обновлять

  • Чтобы формулы не перезаписывали друг друга, вы можете реализовать: sheet.getRange("A" + sheet.getLastRow()+1).setValue(sa);
  • Однако в вашем случае importrange создает пустые строки, которые не являются сценарием, несмотря на запрос, в котором Col1 не равно Null.
  • Таким образом, лучше всего объединить все запросы с ; и поместить их в одну ячейку.
  • Если вы хотите получить последнюю строку или столбец T на листе «Проекты основных таблиц» динамически, вы можете реализовать

var limit = ss.getSheetByName('Master Table Projects').getRange("T2").getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();

а затем цикл до limit

Образец:

function myFunction2() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var sa="={";
  var limit = ss.getSheetByName('Master Table Projects').getRange("T2").getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
  for (var r=2; r<limit; r++) { 
    var sa1="Query(IMPORTRANGE('Master Table Projects'!T"+r+',"Impacted Formula!A5:R1000"),"where Col1 is not Null")';
    sa=sa+sa1+";";
  }
  sa = sa.slice(0,-1) +"}";
  sheet.getRange("A2").setValue(sa);
}
person ziganotschka    schedule 03.07.2020
comment
Спасибо большое за вашу помощь ! Это почти то, что я искал, за исключением того, что с этим кодом формула записывается в каждой ячейке столбца A, но без добавления количества строк, необходимых при каждой вставке, и поэтому, если нужно добавить более одной строки, она не работает из-за перезаписи данных ниже. Идея состоит в том, чтобы иметь эту функцию только в ячейке A2, но с полным циклом, просматривающим каждую ячейку: от T1 до T600. - person Isabelle; 05.07.2020
comment
Я только что попробовал: for (var r = 1; r ‹1000; r ++) {var sa == (Query (IMPORTRANGE ('Master Table Projects'! T + r + ', Imported Formula! A5: R1000), где Col1 не Нулевой))'; sa = sa sheet.getRange (A2) .setValue (sa); Но при этом печатается только значение T999 в ячейке A2, а не объединитель ячеек с T1 по T999 в A2. - person Isabelle; 05.07.2020
comment
Можете ли вы предоставить образец электронной таблицы с вашими данными? А может скриншот желаемого вывода? - person ziganotschka; 06.07.2020
comment
Вам нужно сделать его доступным. - person ziganotschka; 07.07.2020
comment
В соответствии с предоставленной вами дополнительной информацией попробуйте, работает ли sheet.getRange("A" + sheet.getLastRow()).setValue(sa); для вас. Некоторые формулы запросов могут создавать проблемы, создавая дополнительные пустые строки, я не могу проверить это в вашем случае без доступа к вашей электронной таблице. - person ziganotschka; 08.07.2020