2016-04-25 44 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在這裏失敗?

問題2:如何解決問題而不必定義可安裝的觸發器?(我只想複製範圍,同時保留公式)

回答

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.

你怎麼能解決此問題?

編寫通過觸發器或手動執行的應用程序腳本功能,可以使用onEditonChange觸發器或基於時間的觸發器。您甚至可以在需要時手動在Apps Script IDE中運行該功能。這是Apps腳本的預期行爲。

+0

'你不能修改其他文件':我正在修改同一個文件,這是我沒有得到的。如果我修改了不同的電子表格,我會理解,但這不是這種情況。 – Max

+1

@Max據瞭解,這是一張需要授權的表,它不能作爲匿名用戶進行檢索。這些函數只能返回數據,但不能使用任何其他需要授權才能寫入數據的服務。我編輯了我的休息室以反映這一點。 –

+0

清楚。現在使用自定義菜單中的觸發器。 – Max

0

不確定您的數據是否在源電子表格中保留,但您始終可以使用內置的IMPORTRANGE()函數。語法是:

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

其中SPREADSHEET_ID是您正在處理的文件的ID。

+0

意識到'IMPORTRANGE',但它不保存公式(這是我的要求,請參閱問題的第一行) – Max