2016-04-25 7 views
0

Я пытаюсь скопировать диапазон от одного листа к другому (, сохраняя при этом формулы). Я написал простой скрипт, использующий copyTo:У вас нет разрешения на использование copyTo

function copyRangeAcrossSheets(source_sheet,source_range,target_sheet,target_range) { 
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 
    var source_sheet = spreadsheet.getSheetByName(source_sheet); 
    var target_sheet = spreadsheet.getSheetByName(target_sheet); 
    var source_range = source_sheet.getRange(source_range); 
    var target_range = target_sheet.getRange(target_range); 
    source_range.copyTo(target_range); 
} 

Что я называю, как следует:

=copyRangeAcrossSheets("TEST_source","A1:A3","TEST_target","A1:A3")

И я получаю ошибку ниже:

You do not have the permission to call copyTo

Я сделал некоторое рытье и нашел, что functions have to use special triggers (installable) in order to modify another file. Однако здесь я изменяю один и тот же файл.

Q1: Почему copyTo не удается найти здесь?

Q2: Как я могу обойти проблему без определения устанавливаемых триггеров? (Я просто хочу скопировать диапазоны при сохранении формул)

ответ

1

Почему это не удается?

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

Ссылка: https://developers.google.com/apps-script/guides/sheets/functions#using_apps_script_services

Специфическая для вас этот фрагмент:

Spreadsheet: Read only (can use most get*() methods, but not set*()). Cannot open other spreadsheets (SpreadsheetApp.openById() or SpreadsheetApp.openByUrl()).

также:

If your custom function throws the error message "You do not have permission to call X service.", the service requires user authorization and thus cannot be used in a custom function.

Как вы можете обойти эту проблему?

Создать функцию сценариев приложений, которая запускается с помощью триггера или вручную, вы можете использовать триггеры onEdit или onChange или триггер времени. Вы даже можете вручную запустить эту функцию в среде сценариев приложений, если вам нужно. Это предполагаемое поведение скрипта приложений.

+0

'Вы не можете изменять другие документы': я изменяю один и тот же документ, чего не понимаю. Я бы понял, изменил ли я несколько таблиц, но здесь дело не в этом. – Max

+1

@Max Насколько известно, это лист, для которого требуется авторизация, которую он не может получить как анонимный пользователь. Эти функции могут возвращать только данные, но не могут использовать другие службы, требующие авторизации для записи данных. Я отредактировал свой покой, чтобы это отразить. –

+0

OK ясно. Теперь с помощью триггера в пользовательском меню. – Max

0

Не уверен, сохранены ли ваши данные в вашей исходной таблице, но вы всегда можете использовать встроенную функцию IMPORTRANGE(). Синтаксис:

=IMPORTRANGE("SPREADSHEET_ID","SOURCE_SHEET!RANGE_START:RANGE_END") 

Где SPREADSHEET_ID является идентификатор файла, который вы работаете.

+0

Осознавая 'IMPORTRANGE', но он не сохраняет формулы (это требование для меня, см. Первую строку вопроса) – Max

Смежные вопросы