简体   繁体   English

将 Google 工作表数据一次全部导入到现有工作表中

[英]Import Google Sheet Data all at once to an existing sheet with data

Currently I have been using this script which imports data from a spreadsheet located in my google drive.目前我一直在使用这个脚本,它从位于我的谷歌驱动器中的电子表格中导入数据。 The function works but imports the data one line at a time.该功能有效,但一次导入一行数据。 Some times these sheets are 400+ rows and that takes a long time.有时这些工作表有 400 多行,这需要很长时间。 I am looking for it to grab all data and import it into an existing spreadsheet and the end of the last value.我正在寻找它来获取所有数据并将其导入现有电子表格和最后一个值的末尾。

function getData() {

get_files = ['July1-2022'];
  
  var ssa = SpreadsheetApp.getActiveSpreadsheet();
  var copySheet = ssa.getSheetByName('CancelRawData');  
  
  for(z = 0; z < get_files.length; z++)
  {
  
    var files = DriveApp.getFilesByName(get_files[z]);
    while (files.hasNext()) 
    {
      var file = files.next();
      break;
    }
  
    var ss = SpreadsheetApp.open(file);
    SpreadsheetApp.setActiveSpreadsheet(ss);
    var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
    for(var i = 0; i < sheets.length; i++)
    {  
      var nameSheet = ss.getSheetByName(sheets[i].getName()); 
      var nameRange = nameSheet.getDataRange();
      var nameValues = nameRange.getValues();
      
      for(var y = 1; y < nameValues.length; y++)
      {
        copySheet.appendRow(nameValues[y]); 
      }
    }
  }
  SpreadsheetApp.getUi().alert("🎉 Congratulations, your data has been all imported", SpreadsheetApp.getUi().ButtonSet.OK);
}

I believe your goal is as follows.我相信你的目标如下。

  • You want to reduce the process cost of your script.您想降低脚本的处理成本。

Modification points:修改点:

  • appendRow is used in a loop. appendRow在循环中使用。 The process cost will be high.工艺成本会很高。
  • In your script, sheets can be written by var sheets = SpreadsheetApp.open(file).getSheets();在您的脚本中,工作sheets可以通过var sheets = SpreadsheetApp.open(file).getSheets(); . .

When these points are reflected in your script, it becomes as follows.当这些点反映在你的脚本中时,它变成如下。

Modified script 1:修改脚本1:

This script uses the Spreadsheet service (SpreadsheetApp).此脚本使用电子表格服务 (SpreadsheetApp)。

function getData() {
  // Retrieve values.
  get_files = ['July1-2022'];
  var values = [];
  for (z = 0; z < get_files.length; z++) {
    var files = DriveApp.getFilesByName(get_files[z]);
    while (files.hasNext()) {
      var file = files.next();
      break;
    }
    var sheets = SpreadsheetApp.open(file).getSheets();
    for (var i = 0; i < sheets.length; i++) {
      values = [...values, ...sheets[i].getDataRange().getValues()];
    }
  }
  if (values.length == 0) return;

  // Put values.
  const maxLen = Math.max(...values.map(r => r.length));
  values = values.map(r => [...r, ...Array(maxLen - r.length).fill(null)]);
  var copySheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('CancelRawData');
  copySheet.getRange(copySheet.getLastRow() + 1, 1, values.length, values[0].length).setValues(values);
  SpreadsheetApp.getUi().alert("🎉 Congratulations, your data has been all imported", SpreadsheetApp.getUi().ButtonSet.OK);
}

Modified script 2:修改脚本2:

This script uses Sheets API.此脚本使用 Sheets API。 Before you use this script, please enable Sheets API at Advanced Google services .在使用此脚本之前, 请在 Advanced Google services 中启用 Sheets API

function getData() {
  // Retrieve values.
  get_files = ['July1-2022'];
  var values = [];
  for (z = 0; z < get_files.length; z++) {
    var files = DriveApp.getFilesByName(get_files[z]);
    while (files.hasNext()) {
      var file = files.next();
      break;
    }
    var spreadsheetId = file.getId();
    var ranges = SpreadsheetApp.open(file).getSheets().map(s => `'${s.getSheetName()}'!${s.getDataRange().getA1Notation()}`);
    values = [...values, ...Sheets.Spreadsheets.Values.batchGet(spreadsheetId, { ranges }).valueRanges.flatMap(({ values }) => values)];
  }
  if (values.length == 0) return;

  // Put values.
  var dstSS = SpreadsheetApp.getActiveSpreadsheet();
  Sheets.Spreadsheets.Values.append({ values }, dstSS.getId(), 'CancelRawData', { valueInputOption: "USER_ENTERED" });
  SpreadsheetApp.getUi().alert("🎉 Congratulations, your data has been all imported", SpreadsheetApp.getUi().ButtonSet.OK);
}

Note:笔记:

  • When these scripts are run, all files of get_files are retrieved and all values are retrieved from all sheets in all Spreadsheets, and the retrieved values are put to the destination sheet of CancelRawData .运行这些脚本时,将检索get_files的所有文件,并从所有电子表格中的所有工作表中检索所有值,并将检索到的值放入CancelRawData的目标工作表中。

References:参考:

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM