update scripts script manager google getas files developer apps google-apps-script google-drive-sdk google-oauth

google-apps-script - scripts - javascript google apps script



La secuencia de comandos personalizada de la aplicación de Google no funciona después de copiar la hoja de cálculo con el cliente de google java (2)

Tengo una plantilla de hoja de cálculo de google con un complemento personalizado que intento copiar

def copyTemplateSpreadsheet(Drive driveService) { File templateCopy = new File() templateCopy.setName("excel-template") def copiedFile = driveService.files().copy(templateSpreadsheetId, templateCopy).execute() setCorrectPermission(driveService, copiedFile.getId()) copiedFile } private void setCorrectPermission(Drive driveService, def fileId) { Permission newPermission = new Permission(); newPermission.setType("anyone"); newPermission.setRole("writer"); driveService.permissions().create(fileId, newPermission).execute(); }

El problema es que la hoja de cálculo copiada tiene un complemento interrumpido (no se muestra en el menú de complementos). Hay un código de complemento correcto en el editor de scripts, pero cuando intento ejecutar cualquier función recibo un mensaje de error

"We''re sorry, a server error occurred. Please wait a bit and try again"

Tenga en cuenta que el mismo código funciona bien en mi plantilla de hoja de cálculo. Incluso si borro todo el código y dejo vacía la función Abrir, el error aún aparece.

Copiar complementos funciona bien cuando lo hago usando el sitio web regular de Google Drive (drive.google.com) y también funcionó cuando traté de usar el API Explorer de Google ( https://developers.google.com/drive/v3/reference/ archivos / copia # try-it ). El problema parece solo cuando se usa sdk (al menos Java - no he probado otro)

También tenga en cuenta que estoy usando una cuenta de servicio de google creada como se describe en este artículo https://developers.google.com/identity/protocols/OAuth2ServiceAccount#creatinganaccount

y crear instancia de Drive con el siguiente código

Drive getDriveService() throws GeneralSecurityException, IOException, URISyntaxException { HttpTransport httpTransport = new NetHttpTransport(); JacksonFactory jsonFactory = new JacksonFactory(); GoogleCredential credential = new GoogleCredential.Builder() .setTransport(httpTransport) .setJsonFactory(jsonFactory) .setServiceAccountId(G_SERVICE_EMAIL) .setServiceAccountScopes(Arrays.asList(DriveScopes.DRIVE)) .setServiceAccountPrivateKeyFromP12File(PKC_12_FILE) .build(); Drive service = new Drive.Builder(httpTransport, jsonFactory, null) .setHttpRequestInitializer(credential) .build(); return service; }

sin embargo, no estoy seguro si es importante, especialmente porque todo lo demás parece funcionar bien

¿Alguna idea de solución? Estoy abierto a cualquier solución siempre que funcionen. También estaría bien con la creación de un nuevo archivo y simplemente agregando un código adicional, pero parece que no puedo hacerlo con API



Siguiendo el comentario en ¿Cómo puedo crear una hoja de cálculo con script gs incluido por API? , esta es la solución de Scripts de la aplicación para realizar un POST autenticado:

function sendToHR(url,data){ var forDriveScope = DriveApp.getStorageUsed(); //needed to get Drive Scope requested var dataToSend = [getName(),getID()]; for(key in data){ dataToSend.push(data[key]) } var paylod = { "data" : dataToSend }; paylod = JSON.stringify(paylod); var param = { "method":"POST", "headers" : {"Accept":"application/json","Authorization": "Bearer " + ScriptApp.getOAuthToken()}, "payload": paylod }; return UrlFetchApp.fetch(url,param).getContentText(); }

Y tengo un ejemplo en python, que podría ser un poco más útil para usted, para que la secuencia de comandos python se ejecute como un usuario certien. Descargué un archivo JSON con las claves de la consola de proyectos -> crear credencial -> obtener clave y descarga el archivo

def get_service (): global http_auth global deleted_credentials

scopes = [''https://www.googleapis.com/auth/userinfo.email''] keyfile = os.path.join(CURR_DIR, JSON_FILENAME) credentials = ServiceAccountCredentials.from_json_keyfile_name( keyfile, scopes=scopes) delegated_credentials = credentials.create_delegated(ADMIN_EMAIL) http_auth = delegated_credentials.authorize(Http()) return build(''SERVICE'', ''v1'', http=http_auth, discoveryServiceUrl=''DISCOVERY API SERVICE'')

ADMIN_EMAIL es la dirección de correo electrónico del administrador y CURR_DIR y JSON_FILENAME están relacionados con el archivo descargado en su caso. Supongo que no necesita derechos de administrador. Simplemente descargue el archivo JSON de la consola de su proyecto actual y use su dirección de correo electrónico. El mío funciona cuando se utiliza la API de descubrimiento, pero un POST regular debería ser un poco más rápido para hacer