如何使用Javascript更新Google表格的单元格值

时间:2017-04-10 19:43:34

标签: javascript node.js google-sheets-api

到目前为止,我已经编写了这段代码:

var fs = require('fs');
var readline = require('readline');
var google = require('googleapis');
var googleAuth = require('google-auth-library');

// If modifying these scopes, delete your previously saved credentials
// at ~/.credentials/sheets.googleapis.com-nodejs-quickstart.json
var SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly'];
var TOKEN_DIR = (process.env.HOME || process.env.HOMEPATH ||
    process.env.USERPROFILE) + '/.credentials/';
var TOKEN_PATH = TOKEN_DIR + 'sheets.googleapis.com-nodejs-quickstart.json';

// 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 Sheets API.
    authorize(JSON.parse(content), getData);
});

/**
 * 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) {
    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);
            callback(oauth2Client);
        }
    });
}

/**
 * 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: ', 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);
}

/**
 * Print the names and majors of students in a sample spreadsheet:
 * https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit
 */
function getData(auth) {
    var sheets = google.sheets('v4');
    sheets.spreadsheets.values.get({
        auth: auth,
        spreadsheetId: '<ID REMOVED FOR SAFETY>',
        range: 'Sheet1!A1:C',
    }, function (err, response) {
        if (err) {
            console.log('The API returned an error: ' + err);
            return;
        }
        var rows = response.values;
        console.log(rows)
        if (rows.length == 0) {
            console.log('No data found.');
        } else {
            console.log('Name, Major:');
            for (var i = 0; i < rows.length; i++) {
                var row = rows[i];
                if (row[0] == 'ASR') {
                    console.log(row)
                }
                console.log('%s, %s', row[0], row[1]);
            }
        }
    });
}

function writeData() {
    var google = require('googleapis');
    var sheets = google.sheets('v4');

    authorize(function (authClient) {
        var request = {
            // The ID of the spreadsheet to update.
            spreadsheetId: '<ID REMOVED FOR SAFETY>',  // TODO: Update placeholder value.

            // The A1 notation of the values to update.
            range: 'Sheet1!C11',  // TODO: Update placeholder value.

            // How the input data should be interpreted.
            valueInputOption: 'RAW',  // TODO: Update placeholder value.

            resource: {

                // TODO: Add desired properties to the request body. All existing properties
                // will be replaced.
            },

            auth: authClient
        };

        sheets.spreadsheets.values.update(request, function (err, response) {
            if (err) {
                console.log(err);
                return;
            }

            // TODO: Change code below to process the `response` object:
            console.log(JSON.stringify(response, null, 2));
        });
    });

    function authorize(callback) {
        // TODO: Change placeholder below to generate authentication credentials. See
        // https://developers.google.com/sheets/quickstart/nodejs#step_3_set_up_the_sample
        //
        // Authorize using one of the following scopes:
        //   'https://www.googleapis.com/auth/drive'
        //   'https://www.googleapis.com/auth/spreadsheets'
        var authClient = null;

        if (authClient == null) {
            console.log('authentication failed');
            return;
        }
        callback(authClient);
    }
}

严重依赖谷歌自己的文档:https://developers.google.com/sheets/api/quickstart/nodejs

我无法设法在我从https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/update获得的函数writeData()下实现spreadsheets.values.update

我对此代码的两个需求是能够读取所请求的单元格并将特定单元格写入一些数字。我知道代码可能看起来很危险,但这就像我在一个更大的项目中实现它之前测试API一样。

真诚地感谢任何有助于找到发送细胞数据的解决方案的人!

P.S: 我发现互联网上出现了各种其他类似的API,这些API在某些尝试中让我感到困惑,如果有一个你可能认为更合适,请建议改为一个!

再次感谢你! :)

1 个答案:

答案 0 :(得分:0)

enter image description here

Writing to a Cell

https://sheets.googleapis.com/v4/spreadsheets/{SPREADSHEET_ID}}/values/Sheet1!A1:A2

{
    "range":"Sheet1!A2:A3",
    "majorDimension": "ROWS",
    "values": [
        ["UFC"],
        ["KFC"]

    ],
}

一些实际的JS代码供您参考:

  function writeData(){
     //write to A2 to A3 
     var params = {
       "range":"Sheet1!A2:A3",
       "majorDimension": "ROWS",
       "values": [
         ["UFC"],
         ["KFC"]

      ],
     }
     var xhr = new XMLHttpRequest();
     xhr.open('PUT', 'https://sheets.googleapis.com/v4/spreadsheets/'+myspreadsheetId+'/'+"values/"+"Sheet1!A2:A3+"?"+'valueInputOption=USER_ENTERED');
     xhr.setRequestHeader('Authorization', 'Bearer ' + myAccessToken);
     xhr.send(JSON.stringify(params));
  }

Reading from a Cell

function fetchValues(){  
         var xhr = new XMLHttpRequest();
         xhr.open('GET', 'https://sheets.googleapis.com/v4/spreadsheets/'+myspreadsheetId+'/values/'+"Sheet1!A1");
         xhr.setRequestHeader('Authorization', 'Bearer ' + myAccessToken);

      var arrayBuffer;
      var myArr;

     xhr.onload = function (oEvent) {
         arrayBuffer = xhr.response; 
         myArr = JSON.parse(arrayBuffer);

          for(var i = 0; i <= myArr.values.length; i++){
                  document.write(myArr.values[0][i] + "   ");
          }
     };
     xhr.send(null);

}