【问题标题】:How can you read all the sheets in a spreadsheet individually?您如何单独阅读电子表格中的所有工作表?
【发布时间】:2019-08-03 21:28:12
【问题描述】:

目前我只能阅读电子表格的第一张表(“常规”),我的电子表格包含以下表格“常规”、“错误”和“Sheet3”。

目前我已设法将所有可用的工作表名称保存到数组“pages”中,然后检查“Pages”中是否有值,如果有,则删除位置 0 处的值并将其返回(“ General”表)并将其余索引处的值向下移动,然后我检查返回的页面是否等于“General”表,如果是这样,则读取了通用表,但是一旦读取了通用表,我想成为能够使用相同的功能阅读其余的工作表。

所以我想要实现的是调用 readPages() 函数并让它读取我的电子表格中的所有工作表。

function readPages(sheets, spreadsheetId, pages) {
  if (pages.length) {
    var page = pages.shift();

    if (page === "General") {
      //read general
      sheets.spreadsheets.values.get(
        {
          spreadsheetId: spreadsheetId,
          range: "General"
        },
        (err, res) => {
          var values = null;

          if (err) {
            console.log("Problem reading" + page);
          } else {
            console.log("reading " + page);
            values = res.data.values;
            values = readGeneralSheet(values);
          }
        }
      );
    } else {
      //read rest of the sheets
      sheets.spreadsheets.values.get(
        {
          spreadsheetId: spreadsheetId,
          range: page
        },
        (err, res) => {
          var values = null;

          if (err) {
            console.log("Problem reading" + page);
          } else {
            console.log("reading other sheet " + page);
            values = res.data.values;
            values = readGeneralSheet(values);
            values = readSheet(values, res.data.values);
          }
        }
      );
    }
  } else {
    //finish
    console.log("no more pages to read");
  }
}

【问题讨论】:

  • 我为我糟糕的英语水平道歉。我想正确理解你的问题。那么我可以问一下你的目标read all the sheets in a spreadsheet individually 吗?通过了解它,我认为我可能能够想到解决方案。
  • 当然!所以我想要 readPages() 函数实现的是首先检查“pages”数组中是否有任何值,然后删除数组中的第一个值并检查该值是否等于“General”,如果该值等于“General”,那么我想调用 readGeneralSheet() 函数。阅读“常规”工作表后,我想逐一遍历留在“页面”数组中的剩余工作表。对不起,如果我的解释不清楚,但我希望它有所帮助!
  • 感谢您的回复。根据您的回复,我提出了一个修改后的脚本作为答案。你能确认一下吗?首先,请检查我对您的问题的理解是否正确。如果我误解了您的问题并且这不是您想要的结果,我深表歉意。那时,你能帮我理解你的目标吗?通过这个,我想修改脚本。

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


【解决方案1】:

我提供这个答案是因为我认为您可能对工作表身份和检索有错误的理解。

在此答案中,“getSheets”检索所有工作表。以下代码行(取自文档)仅列出了第二张工作表的工作表名称(因为序列号从零开始)。

答案的第二个元素是一个循环,它遍历“工作表”的值(来自geSheets 并将这些值放入一个数组中。现在数组(页面)包含工作表的所有名称)。

第三个元素是第二个循环(可以与第一个循环组合),它检索每个工作表名称并使用getSheetByName(name); 使工作表处于活动状态。从这里你可以在工作表中做任何你想做的事情。


function so5734222601() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  if (sheets.length > 1) {
    //Logger.log("DEBUG: The active sheet is = "+sheets[1].getName());
  }
  pages=[];

  // loop through the sheets and assign to an array called pages.
  for (var i=0;i<sheets.length;i++){
    //Logger.log("DEBUG: sheet#"+i+" = "+sheets[i].getName());
    pages.push(sheets[i].getName());
  }

  // Logger.log("DEBUG: example: sheet#0 = "+pages[0]);

  //loop through the sheets
  for (z=0;z<pages.length;z++){
    var sheetname = pages[z];
    var thesheet = ss.getSheetByName(sheetname);
    Logger.log("DEBUG: The current sheet = "+thesheet.getName());
    // do stuff
  }
}

参考
getSheetByName(name);
getSheets

【讨论】:

    【解决方案2】:

    这个修改怎么样?

    我希望 readPages() 函数实现的是首先检查“pages”数组中是否有任何值,然后删除数组中的第一个值并检查该值是否等于“General ",如果该值等于 "General",那么我想调用 readGeneralSheet() 函数。阅读完“常规”工作表后,我想逐一遍历留在“页面”数组中的剩余工作表。

    从你上面的replying,我理解如下。

    • pages的第一个元素是General时,
      • 您想从General 的工作表中检索值并运行readGeneralSheet(values) 的函数。
      • 您希望从工作表中检索除General 之外的值。
    • pages的第一个元素不是General时,
      • 您不想检索这些值。

    如果我的理解是正确的,那么这个修改呢?

    修改点:

    • 在此修改中,当pages 的第一个元素为General 时,将检索pages 中的所有值。然后,将每个值分开。这样,我认为可以降低流程成本。

    修改脚本:

    function readPages(sheets, spreadsheetId, pages) {
      if (pages.length && pages[0] === "General") {
        sheets.spreadsheets.values.batchGet(
          {
            spreadsheetId: spreadsheetId,
            ranges: pages
          },
          (err, res) => {
            if (err) {
              console.log(err);
              return;
            }
            const values = res.data.valueRanges;
    
            // "General" sheet.
            const generalValues = readGeneralSheet(values.shift().values);
            console.log(generalValues);
    
            // Other sheets.
            const valuesOfOtherSheets = values.map(e => e.values);
            console.log(valuesOfOtherSheets);
          }
        );
      } else {
        //finish
        console.log("no more pages to read");
      }
    }
    

    注意:

    • 除了“常规”之外的工作表的值都放在二维数组中。

    参考:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-11
      • 1970-01-01
      相关资源
      最近更新 更多