从 JavaScript 范围内的每个 sheet 工作簿中获取值

get values from each sheet of workbook of range in JavaScript

我正在尝试从数组中的所有 sheet 中获取给定范围内每个单元格的值(范围在数组 (rangeAdd) 中,格式为“M1:T14”)(一个 [ 的值=24=] 应在数组的一行中)。我的代码如下,

async function getDataFromEachSheet(rangeAdd) {
  await Excel.run(async (context) => {
    var sheets = context.workbook.worksheets;
    sheets.load("items/name");
    await context.sync();
    sheets.items.forEach( (sheet) =>{
      var a =[]
      for (const currentRange of rangeAdd) {
        var range = sheet.getRange(currentRange);
        range.load("values");
        context.sync();
        console.log(range.values)
        var arr = [];
        arr = range.values
        var a = arr.join().split(',')
      }
    });
  });
}

我正在
1.“未处理的承诺拒绝”和
2."属性 'values' 不可用。在读取 属性 的值之前,调用包含对象的加载方法并调用 "context.sync()" 在关联的请求上下文中。"
我无法使用 await context.sync() 而不是 context.sync();

您可以尝试使用 return context.sync().then() 而不是使用 await context.sync()。所以更新后的代码可能看起来像这样:

async function getDataFromEachSheet(rangeAdd) {
  await Excel.run(async (context) => {
    var sheets = context.workbook.worksheets;
    sheets.load("items/name");
    await context.sync();
    sheets.items.forEach((sheet) => {
      var a = []
      for (const currentRange of rangeAdd) {
        var range = sheet.getRange(currentRange);
        range.load("values");
        return context.sync().then(()=>{
          console.log(range.values)
          var arr = [];
          arr = range.values
          var a = arr.join().split(',')
        })
      }
    });
  });
}

借助避免在循环中使用 context.sync 方法 https://docs.microsoft.com/en-us/office/dev/add-ins/concepts/correlated-objects-pattern。我已经设法通过以下代码获得值。

    async function getDataFromEachSheet(rangeAdd) {
      try {
      await Excel.run(async (context) => {
        const sheets = context.workbook.worksheets.load("items/name");
        await context.sync();
        var rangeObj = [];
        sheets.items.forEach((sheet) => {
          rangeAdd.forEach((currentRange) => {
            const range = sheet.getRange(currentRange).load("values") ;
            rangeObj.push(range);
          });
        });
        await context.sync();
        console.log(rangeObj)
      })
      }
      catch (error) {
        console.error(error);
        }
     }