首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从google电子表格到JS数组

从google电子表格到JS数组
EN

Stack Overflow用户
提问于 2016-07-18 22:25:03
回答 2查看 2.5K关注 0票数 0

我有一个谷歌电子表格,我已经公开了所有的,并想从它转到一个JS数组。我一直在尝试将其转换为JSON,然后再转换为数组,但我没有成功。有没有办法从我的电子表格转到2dJS数组,然后我可以在上面运行函数。

因此,如果电子表格看起来像这样:

代码语言:javascript
运行
复制
NAME  COLOR  SIZE
MARK   BLUE     6
DAVE    RED     8

该数组将是一个二维数组,这样值将是MARK,1将是蓝色,并且将是DAVE等。

任何帮助都将不胜感激

EN

回答 2

Stack Overflow用户

发布于 2020-07-15 06:45:47

编辑:由于google API4是我们的,模块也进行了相应的更新,由于API3将于9月停产,因此我相应地更新了代码。

我知道这已经过时了,但如果其他人在寻找答案:

我尝试在JS中操作google电子表格,希望从一个包含多个工作表的工作表转换为一个可以在其他函数中轻松使用的数组。

所以我写了一个程序来访问一个工作表,从里面获取所有的工作表(tab),减少全空的行和列,并返回一个新的工作表数组。工作表数组中的每个元素表示Excel工作表中的工作表。此外,每个元素都有其单元格的二维数组,如下所示:

代码语言:javascript
运行
复制
cellsArr:[[row],[col]]

要运行该程序,只需将YOUR_CLIENT_SECRET.json替换为客户端机密json文件,并将ENTER_GOOGLE_SPREADSHEET_ID_FROM_URL替换为电子表格的ID。例如:

docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit#gid=01

然后运行:

代码语言:javascript
运行
复制
getWorksheet(ENTER_GOOGLE_SPREADSHEET_ID_FROM_URL);

这将返回一个promise,并将其解析到修订后的工作表中(如上所述)。请注意,reduceRowsCols()会从每个工作表中删除空行和空列。它删除第一个列单元格为空的每一行,以及第一个行单元格为空的每一列,因此删除每一行的[i][0]==null和每一列的[0][i]==null。只需从代码中删除reduceRowsCols()即可取消此操作

代码语言:javascript
运行
复制
  const fs = require('fs');

const {GoogleSpreadsheet} = require('google-spreadsheet'),
    creds = require('./client_secret.json'), 

/**
 * @Description Authenticate with the Google Spreadsheets API using credentials json. 
 * @param {string} spreadsheet_id  - spreadsheet id to get. Get this from the URL of the spreadsheet
 * Returns the entire raw worksheet.
 * */
async function accessSpreadsheet(spreadsheet_id) {
    const doc = new GoogleSpreadsheet(spreadsheet_id);
    await doc.useServiceAccountAuth(creds);
    await doc.loadInfo();
    console.log(`${getCurrentTime()}: Loaded raw doc ${doc.title}`);
    return doc;
}
/**
 * @Description This is an async function to retrieve the raw worksheet
 * @param {string} spreadsheet_id  - spreadsheet id to get. Get this from the URL of the spreadsheet
 * */
async function getWorksheet(spreadsheet_id) {
    try {
        let res = await accessSpreadsheet(spreadsheet_id);
        console.log(`${getCurrentTime()}: Organizing sheets for extraction...`);
        res = await getCondensedWorksheets(res.sheetsByIndex);
        createSheetsCopy(res);
        return res;
    } catch (e) {
        throw (e);
    }
}

/**
 * @param worksheetsArr
 */
async function getCondensedWorksheets(worksheetsArr) {
    if (!Array.isArray(worksheetsArr)) {
        throw `getCondensedWorksheets: worksheets variable passed is not an array. Object passed:\n${worksheetsArr}`;
    }
    let revisedArr = [];
        for (let i = 0; i < worksheetsArr.length; i++) {
        // for (let i = 0; i < 1; i++) {
        
        revisedArr.push(await worksheetsArr[i].getRows().then((res)=>{
            let thisRevised = {
                id: worksheetsArr[i]._rawProperties.sheetId,
                title: worksheetsArr[i].title,
                rowCount: worksheetsArr[i].rowCount,
                colCount: worksheetsArr[i].columnCount,
                getRows: worksheetsArr[i].getRows,
                getHeaders: worksheetsArr[i].headerValues,
                getCells    :   res.map( row => {return(row._rawData);}),
                resize: worksheetsArr[i].resize,
            }                
            return getCells2dArray(thisRevised);
        }))
    }
    return Promise.all(revisedArr).then(()=>{
        return revisedArr;
    })    
}

/**
 * @param {array} thisSheet - a single sheet (tab)
 */
function getCells2dArray(thisSheet) {
        let sheetCellsArr = [];
       
        sheetCellsArr.push(thisSheet.getHeaders);
        thisSheet.getCells.map(row => {
            sheetCellsArr.push(row);
        })
        thisSheet.cellsArr = sheetCellsArr;   
        delete thisSheet.getCells;
        reduceRowsCols(thisSheet); 
    return thisSheet;
}

function reduceRowsCols(thisSheet) {
    for (let i = 0; i < thisSheet.cellsArr.length; i++) {
        if (thisSheet.cellsArr[i][0] == null) {
            thisSheet.cellsArr.slice(0, i);
            break;
        }
    }

    for (let i = 0; i < thisSheet.cellsArr[0].length; i++) {
        if (thisSheet.cellsArr[0][i] == null) {
            thisSheet.cellsArr[0].slice(0, i);
            break;
        }
    }
}

const getCurrentTime = function (){
    var date = new Date();
    return `${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}:${date.getMilliseconds()}`
}

module.exports = {getWorksheet};

票数 2
EN

Stack Overflow用户

发布于 2016-07-19 05:18:12

GAS中有两种方法可以读取单元格中的值。它们是.getValue().getValues()。正如所暗示的那样,.getValue()只检索区域中左上角单元格的值。.getValues()检索范围内所有值的二维数组。

下面的代码定义了读取以下范围所需的变量。范围被定义为(基于您的示例)从第二行开始(忽略标题行),从3列一直到最后一行内容。

您会注意到,我们找到了.getLastRow(),但随后将要读取的行数定义为lastRow - 1。这是因为.getLastRow()为我们提供了包含数据的最后一行的位置;或者更简单地说,是包含多少行数据的整数。如果我们有20行数据,包括我们想要忽略的标题行。在将范围向下移动一行后读取20行将包括第一个空行。读取19行在读取最后一个填充了数据的行后停止。

请注意,.getRange()需要.getRange(startRow, startColumn, numRows, numColumns)的输入。这可以在GAS参考表here中找到更多细节和解释

代码语言:javascript
运行
复制
function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSpreadsheet();
  var lastRow = sheet.getLastRow();
  var range = sheet.getRange(2, 1, (lastRow - 1), 3);
  var dataArray = range.getValues();
}

然后可以调用、定义、读取这个数组中的值,就像您对Javascript所期望的那样。在GAS参考资料中,您会发现许多方法都有单数和复数版本,如.getBackground().getBackgrounds()。它们将以与.getValue().getValues()相同的比较方式运行。

还可以注意到,即使您的范围是单个行但有许多列,.getValues()也会为您提供一个二维数组,其中所有值都将以[0]开头,因为row的唯一可能值是0。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38439219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档