Как добавить строку в гугл лист синхронно? - PullRequest
1 голос
/ 04 ноября 2019

Я использую библиотеку Google-таблиц для доступа и вставки данных в Google Sheets. Мне удалось добавить несколько строк, но каждая строка добавляется в произвольном порядке, я полагаю, из-за асинхронного поведения addRow ().

Пример данных:

let myData = [{id: "1", fname: "John"}, {id: "2", fname: "Matt"}, {id: "3", fname: "Paul"}]

for (let i = 0; i < myData.length; i++) {
    let row = myData[i];

    // Async call to insert row.
    doc.addRow(sheetIndex, row, (err) => {
        if (err) throw err;    
    });
}

Цикл For выполняет итерации и передает каждый объект строки в addRow (), но его не волнует, каков порядок, когда каждая строка вставляется в Googlesheets.

Я пытался сделать асинхронный подход, чтобы дождаться doc.addRow (), прежде чем он перейдет к следующему объекту строки, но мне не повезло. Есть ли способ добиться вставки в том же порядке, который я передаю? Заранее спасибо! :)

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Вы не могли ждать функцию, вероятно, потому что она не возвращает Promise. Итак, давайте сначала пообещаем эту функцию.

function asyncAddRow(sheetIndex, row) {
  return new Promise((res, rej) => {
    doc.addRow(sheetIndex, row, (err) => {
      if (err) rej(err);
      else res(true);
    });
  })
}

Теперь вместо вызова doc.addRow вы вызываете наш asyncAddRow. Так как он возвращает обещание, так что вы можете ждать его сейчас. Как это:

for (let i = 0; i < myData.length; i++) {
  let row = myData[i];

  await asyncAddRow(sheetIndex, row);
}
1 голос
/ 04 ноября 2019

Вы должны использовать метод append()

let values = [
  [
    // Cell values ...
  ],
  // Additional rows ...
];
let resource = {
  values,
};
this.sheetsService.spreadsheets.values.append({
  spreadsheetId,
  range,
  valueInputOption,
  resource,
}, (err, result) => {
  if (err) {
    // Handle error.
    console.log(err);
  } else {
    console.log(`${result.updates.updatedCells} cells appended.`);
  }
});

Больше информации там

...