错误:Node.js到Google Apps脚本的脚本错误

我正在尝试使用Google Apps Script Node.js教程,并将其调整为通用的Google Apps脚本function调用方。 这是我想出来的

var fs = require('fs'); var path=require('path'); var readline = require('readline'); var google = require('googleapis'); var googleAuth = require('google-auth-library'); var SCOPES = ['https://www.googleapis.com/auth/drive']; var TOKEN_DIR = path.dirname(path.dirname(path.dirname(process.execPath))) + '/other/credentials/'; var TOKEN_PATH = TOKEN_DIR + 'script-nodejs-quickstart.json'; //I ADDED THIS FUNCTION WITH THE PARAMETERS exports.run=function (myfunction,myparam){ // Load client secrets from a local file. fs.readFile('client_secret.json', function processClientSecrets(err, content) { if (err) { console.log('Error loading client secret file: ' + err); return; } // Authorize a client with the loaded credentials, then call the // Google Apps Script Execution API. console.log('one ran'); //TRANSFER THE PARAMETERS TO authorize authorize(JSON.parse(content), callFunction,myfunction,myparam); }); } /** * Create an OAuth2 client with the given credentials, and then execute the * given callback function. * * @param {Object} credentials The authorization client credentials. * @param {function} callback The callback to call with the authorized client. */ function authorize(credentials, callback,myfunction,myparam) { var clientSecret = credentials.installed.client_secret; var clientId = credentials.installed.client_id; var redirectUrl = credentials.installed.redirect_uris[0]; var auth = new googleAuth(); var oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl); // Check if we have previously stored a token. fs.readFile(TOKEN_PATH, function(err, token) { if (err) { getNewToken(oauth2Client, callback); } else { oauth2Client.credentials = JSON.parse(token); console.log('now two'); //TRANSFER THE PARAMETES TO callFunction callback(oauth2Client,myfunction,myparam); } }); } /** * Get and store new token after prompting for user authorization, and then * execute the given callback with the authorized OAuth2 client. * * @param {google.auth.OAuth2} oauth2Client The OAuth2 client to get token for. * @param {getEventsCallback} callback The callback to call with the authorized * client. */ function getNewToken(oauth2Client, callback) { var authUrl = oauth2Client.generateAuthUrl({ access_type: 'offline', scope: SCOPES }); console.log('Authorize this app by visiting this url: \n', authUrl); var rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.question('Enter the code from that page here: ', function(code) { rl.close(); oauth2Client.getToken(code, function(err, token) { if (err) { console.log('Error while trying to retrieve access token', err); return; } oauth2Client.credentials = token; storeToken(token); callback(oauth2Client); }); }); } /** * Store token to disk be used in later program executions. * * @param {Object} token The token to store to disk. */ function storeToken(token) { try { fs.mkdirSync(TOKEN_DIR); } catch (err) { if (err.code != 'EEXIST') { throw err; } } fs.writeFile(TOKEN_PATH, JSON.stringify(token)); console.log('Token stored to ' + TOKEN_PATH); } /** * Call an Apps Script function to list the folders in the user's root * Drive folder. * * @param {google.auth.OAuth2} auth An authorized OAuth2 client. */ function callFunction(auth,myfunction,myparam) { console.log('now we are at the last'); var scriptId = 'my apps script id'; var script = google.script('v1'); // Make the API request. The request object is included here as 'resource'. //PARAMETERS APPLIED script.scripts.run({ auth: auth, resource: { function: myfunction, parameters: myparam, devMode:true }, scriptId: scriptId }, function(err, resp) { console.log(myfunction,myparam,auth); if (err) { // The API encountered a problem before the script started executing. console.log('The API returned an error: ' + err); return; } if (resp.error) { // The API executed, but the script returned an error. // Extract the first (and only) set of error details. The values of this // object are the script's 'errorMessage' and 'errorType', and an array // of stack trace elements. var error = resp.error.details[0]; console.log('Script error message: ' + error.errorMessage); console.log('Script error stacktrace:'); if (error.scriptStackTraceElements) { // There may not be a stacktrace if the script didn't start executing. for (var i = 0; i < error.scriptStackTraceElements.length; i++) { var trace = error.scriptStackTraceElements[i]; console.log('\t%s: %s', trace.function, trace.lineNumber); } } } else { exports.result(resp.response.result); } }); } exports.result=function(result){ return result; } 

一切都在CAPS是我的评论。 我的问题是,每次我testing它返回:

 The API returned an error: Error: ScriptError 

api和app脚本的权限是一致的。 所以它不是一个权限错误。 它不给我任何其他细节。 有谁知道是什么原因造成这个错误?

这是由于Node.js库parsing响应的一个早期问题,在https://github.com/google/google-auth-library-nodejs/commit/323​​b794f3aa8bf7291041620155451c3f3b2b4d2中解决了这个问题&#x3002; 如果你重新安装google-auth-library,那么你应该看到完整的错误细节。

很可能你有一个范围问题。 我发现使用spreadhseets的正确范围是https://www.googleapis.com/auth/spreadsheets 。 这可以在文件 – >项目属性 – >范围下的脚本编辑器中看到。

我遇到了同样的问题,并通过添加适当的范围解决我的脚本解决。

通过查看“文件>项目属性>作用域”,确保在node.js脚本中有完全相同的作用域列表。

这在“快速入门”中没有提及,但以下文档对此进行了描述: https : //developers.google.com/apps-script/guides/rest/api#general_procedure