Переменные выделены серым цветом?

#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() не возвращает a Range , но возвращает 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 .