#google-apps-script
#google-apps-script
Вопрос:
Новый пользователь. Мой первый вопрос.
Сейчас я на пенсии, но раньше я немного работал с Excel и VBA. Теперь я пытаюсь помочь другу с приложением Google Sheets.
Моя задача довольно проста. Скопируйте диапазон данных с одного листа и перейдите на другой лист, перейдите к первой пустой строке и вставьте данные в виде значений.
Прежде всего, переменная UHsheet отображается розовым цветом на экране скрипта моих приложений, а переменные oldRange и newRange — нет, они оба выделены серым цветом. Не уверен, почему это так, но я не смог понять это, и я думаю, что это может быть моей главной проблемой.
В любом случае, когда я запускаю этот скрипт, я получаю это сообщение об ошибке:
Ошибка типа: oldRange.CopyTo не является функцией.
Это потому, что сценарий приложений не распознает переменную oldRange? Если да, то как мне это исправить?
Спасибо.
/** @OnlyCurrentDoc */
function SaveHistory() {
var oldRange = SpreadsheetApp.getActiveSheet().getSelection();
var UHsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Usage History');
var newRange = (UHsheet.getLastRow() 1);
oldRange.copyTo(newRange, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
};
Комментарии:
1. Обратите внимание на «типы» / «классы».
oldRange
не имеет типаRange
.getSelection()
не возвращает aRange
, но возвращаетSelection
.Selection
не имеетcopyTo
метода. Следовательно,oldRange.copyTo
это не функция. Вы можете использоватьSelection.getActiveRange()
для получения диапазона изSelection
Ответ №1:
function SaveHistory() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getActiveSheet();
const rg = sh.getActiveRange();
const uHsheet = ss.getSheetByName('Usage History');
rg.copyTo(uHsheet.getRange(uHsheet.getLastRow() 1, 1), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
}
Комментарии:
1. Спасибо, Купер! Это отлично работает! Но почему вы используете константы, а не переменные?
2. const не может быть переопределен, и ни один из них не должен быть переопределен. Мне всегда нравится идти по пути, который удерживает меня от ошибок в дальнейшем.
Ответ №2:
Обратите внимание на «типы» / «классы». oldRange
не имеет типа Range
. getSelection()
не возвращает a Range
, но возвращает Selection
. Selection
не имеет copyTo
метода. Следовательно, oldRange.copyTo
это не функция. Вы можете использовать Selection.getActiveRange()
для получения диапазона из Selection
:
const oldRange = SpreadsheetApp.getActiveSheet().getSelection().getActiveRange();
newRange
также не имеет типа Range
, но Number
.