#google-apps-script #google-sheets
#google-apps-script #google-sheets
Вопрос:
У меня есть следующее, которое работает нормально:
function phototable() {
var ss = SpreadsheetApp.openById('####');
var lastRow = ss.getLastRow();
ss.getRange('H' lastRow)
.setValue('=VLOOKUP("Form Responses_Images/"amp;B' lastRow ',importrange("https://docs.google.com/spreadsheets/d/####/edit","Form Responses!U:Z"),4,false)');
}
Однако я не хочу, чтобы формула копировалась в столбец H
, только фактическое значение. Итак, я попытался:
ss.getRange('H' lastRow)
.getValue('=VLOOKUP("Form Responses_Images/"amp;B' lastRow ',importrange("https://docs.google.com/spreadsheets/d/###/edit","Form Responses!U:Z"),4,false)')
.copyTo('H' lastRow,{contentsOnly:true});
Но это ничего не вставляет в столбец H. Есть идеи?
Ответ №1:
Точки модификации:
- О
I have the following that works fine:
, когда я увидел приведенный выше сценарий, я думаю, что ошибка возникает наgetValue
. ПотомуgetValue
что не имеет аргументов. Я так и думалgetValue
setValue
. - При
copyTo('H' lastRow,{contentsOnly:true})
этом 1-м аргументом является объект диапазона. - Для того, чтобы скопировать результат формулы во время выполнения скрипта в виде строки, требуется использовать
flush
.
Когда вышеуказанные пункты будут отражены в вашем скрипте, это будет выглядеть следующим образом.
Модифицированный скрипт:
function phototable() {
var ss = SpreadsheetApp.openById('####');
var lastRow = ss.getLastRow();
var range = ss.getRange('H' lastRow);
range.setValue('=VLOOKUP("Form Responses_Images/"amp;B' lastRow ',importrange("https://docs.google.com/spreadsheets/d/###/edit","Form Responses!U:Z"),4,false)');
SpreadsheetApp.flush();
range.copyTo(range, {contentsOnly:true});
}
Примечание:
- В вашем скрипте
ss
это 1-я вкладка электронной таблицы. Пожалуйста, будьте осторожны с этим.
Ссылки:
Ответ №2:
Проблемы / Объяснение:
У вас есть 2 способа обновить ячейку в столбце H значением формулы:
-
Если вы хотите обновить ячейку в H с ее значением, затем получите значение и установите его обратно:
range.setValue(range.getValue());
-
Используйте метод CopyTo():
range.copyTo(range, {contentsOnly:true});
В качестве дополнительной информации CopyTo() нельзя использовать, если исходный диапазон и целевой диапазон не относятся к одному и тому же файлу электронной таблицы.
- Поскольку этот процесс происходит очень быстро, рекомендуется использовать flush() для завершения ожидающих изменений в таблице.
Решение:
function phototable() {
var ss = SpreadsheetApp.openById('####').getSheetByName('Sheet1');
var lastRow = ss.getLastRow();
var range = ss.getRange('H' lastRow);
range.setValue('=VLOOKUP("Form Responses_Images/"amp;B' lastRow ',importrange("https://docs.google.com/spreadsheets/d/####/edit","Form Responses!U:Z"),4,false)');
SpreadsheetApp.flush();
range.setValue(range.getValue());
// range.copyTo(range, {contentsOnly:true}); // choose this or the previous line
}
Измените Sheet1
на имя листа, к которому вы хотите применить эту операцию.
- Также лучше выбрать конкретный лист, прежде чем применять к нему какую-либо функцию. Чтобы получить лист по его имени, используйте getSheetByName().