1

회사 용 간단한 애드온을 만들었습니다. addon은 호출되면 현재 시트를보고 주어진 용어집에서 모든 셀을 해당 값으로 바꿉니다.Google Apps Sheet addon에 외부 시트로드

등, "321_name"에 의해 "이름"을 대체 할

이렇게하려면, 내가 지방을 사용하는 예를 들어, 값 "브랜드"로 모든 셀을 찾을 것이며, "123_brand"로 교체 첫 번째 열에는 "브랜드", "이름"등이 있고 두 번째 열에는 "123_brand", "321_name"등이 있습니다.) ("용어집 시트"). 우리 회사의 모든 구성원이 해당 시트에 대한 읽기 권한을 가지고 있습니다.

나는 다음과 같은 방법으로로드 :

function onOpen() { 
    SpreadsheetApp.getUi().createAddonMenu() 
     .addItem('Parse sheet', 'parseSheet') 
     .addToUi(); 
} 

function onInstall(){ 
onOpen(); 
} 

var librarySpreadsheet = SpreadsheetApp.openById("ID to my Glossary Sheet"); 

function parseSheet(){ 
    /* Does the sheet parsing */ 
} 

문제이다 : 그것은 작동하지 않습니다.

설치 직후 "Parse Sheet"버튼이 정상적으로 나타나며 모든 것이 작동합니다. 그러나 사용자가 다른 시트로 이동하면 추가 기능이 작동하지 않습니다. 콘솔을 확인하면 다음 메시지가 표시됩니다.

Google Apps Script : 해당 작업을 수행 할 수있는 권한이 없습니다.

사용자가 다른 시트에서 애드온을 제거했다가 다시 설치하면 정상적으로 다시 작동하기 시작합니다.

대신 편집 권한 부여를 시도했지만 여전히 작동하지 않습니다. 이는 모든 사용자에게 적용됩니다.

애드온을 설치 한 직후를 제외하고 외부 스프레드 시트에 대한 액세스가 거부되는 이유는 무엇입니까?

var librarySpreadsheet = SpreadsheetApp.openById("ID to my Glossary Sheet"); 

이 함수에 선언되지 즉 글로벌 delcaration입니다 :

+1

"권한 부여 모드"와 관련이 있다고 생각합니다. 견적 : *** 저장소에서 추가 기능을 설치하면 해당 onInstall (e) 기능이 AuthMode.FULL에서 실행됩니다. *** 추가 기능이 설치된 후에 AuthMode가 변경 될 수 있습니다. [애드온 인증 라이프 사이클에 연결] (https://developers.google.com/apps-script/add-ons/lifecycle)을 읽었습니까? –

+0

애드온이 작동하지 않는다고 말하면, 추가 메뉴에서이 특정 addon을 볼 수 없습니까? –

+0

@JackBrown 내가 addons 메뉴에서 addon을 볼 수 있다는 것을 의미하지만 그 기능 중 아무 것도 그냥 "Help" –

답변

1

이 글로벌 선언은 당신이 당신의 부가 기능에 부가 기능 메뉴 기능을보고하지 않는 그 이유입니다. 따라서 새 문서를 여는 시점에 onOpen() 함수가 호출되면 실행됩니다. 설명서 페이지에서 인용 한 내용입니다.

경고 : onOpen (e) 함수를 실행하면 전체 스크립트가로드되고 전역 명령문이 실행됩니다. 이 명령문은 onOpen (e)과 동일한 인증 모드로 실행되며 모드가이를 금지하면 실패합니다. 이렇게하면 onOpen (e)이 실행되지 않습니다. 게시 된 추가 기능이 메뉴 항목을 추가하지 못한 경우 브라우저의 JavaScript 콘솔에서 오류가 발생했는지 확인한 다음 스크립트를 검사하여 onOpen (e) 함수 또는 전역 변수가 허용되지 않는 서비스를 호출하는지 확인합니다 AuthMode.NONE에서.

애드온이 설치되어 있고 새 스프레드 시트에서 활성화되어 있지 않으므로 authMode.None 인증이 실행됩니다. 해당 인증 모드에서는 스프레드 시트를 열 수있는 권한이 없습니다. 따라서 전역 선언은 실패하고 onOpen은 메뉴 항목을 추가하지 않고 조기에 종료됩니다.

그것이 해결하기 위해 나의 제안 방금 당신의 parseSheet 기능으로 전체 선언을 이동 다음

function parseSheet(){ 
var librarySpreadsheet = SpreadsheetApp.openById("ID to my Glossary Sheet"); 
    /* Does the sheet parsing */ 
} 

또는 전역 변수로 librarySpreadsheet를 원한다면 당신이이 일을 시도 할 수 있습니다 :

var librarySpreadsheet 
function parseSheet(){ 
    librarySpreadsheet = SpreadsheetApp.openById("ID to my Glossary Sheet"); 
     /* Does the sheet parsing */ 
    } 

마지막으로, 재설치시 왜 작동합니까? (@SandyGood 님이 이미 답변 해 주셨습니다!) 설치되면 addon은 설치 승인을 위해 사용자 상호 작용이 필요하기 때문에 authoMode.FULL으로 실행됩니다.

따라서 AuthMode.FULL의 문서에서 인용

추가 기능이 저장소에서 설치

, 그 온 인스톨 (예) 함수는 실행, 그것은 글로벌 것을 얻을이 수를 다시 설치 또한 해당 문서의 애드온을 활성화합니다. 따라서 애드온은 해당 문서뿐만 아니라 향후 실행을 위해 잘 작동합니다.

+0

그게 다야, 고마워! –