2017-04-10 21 views
1

到目前爲止,我寫了這個代碼:如何更新谷歌表的單元格的值與JavaScript

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

我卻無法管理實現電子表格。 values.update下的函數writeData()我從https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/update

我得到這兩個代碼的需求是能夠讀取請求的單元格和寫入特定單元格的一些數字。我明白代碼可能看起來有點危險,但是這正如我在測試API之前在更大的項目中實施API一樣。

真誠感謝任何人,這將有助於尋找發送細胞數據的解決方案!

P.S: 我發現在互聯網上浮動的各種其他類似的API在某些嘗試中讓我困惑,如果有一個你可能認爲更合適,請建議一個!

再次感謝您! :)

+0

您可能會殺死整個授權流程,只需傳遞您現有的'auth'var(與傳遞給'get'的同一個)並按原樣使用。假設你這樣做,你會得到什麼錯誤? –

回答

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); 

}