【问题标题】:Importing multiple CSV files to google sheets with Google Script使用谷歌脚本将多个 CSV 文件导入谷歌表格
【发布时间】:2017-10-23 01:49:49
【问题描述】:

我正在编写一个 google 脚本,将 CSV 文件从 web url 导入到 google 表格中的各个表格中。我想在导入新信息之前清除某些列的内容。在导入之前,我无法让脚本清除内容。我还曾在一张纸上包含一个 CSV 的一部分以及另一个。我想我需要在 CSV 文件之间的脚本中添加一些内容。我还需要在导入之前添加一些内容来清除内容。我不想只是清除工作表,因为有些公式需要保留。我也不想使用 Google IMPORTDATA 功能,因为它不可靠。

这是我当前的脚本(已删除 URL):

function importCSVFromWeb() {

  var csvUrl = "http://csvurlhere";
  var csvContent = UrlFetchApp.fetch(csvUrl).getContentText();
  var csvData = Utilities.parseCsv(csvContent);
  var ss = SpreadsheetApp.openByUrl('spreadsheeturlhere');
  var sheet = SpreadsheetApp.getActiveSheet();
  var ss = sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);

  var csvUrl = "http://csvurlhere";
  var csvContent = UrlFetchApp.fetch(csvUrl).getContentText();
  var csvData = Utilities.parseCsv(csvContent);
  var sheet = SpreadsheetApp.getActive().getSheetByName('RentPaid');
  var ss = sheet.getRange(3, 3, csvData.length, csvData[0].length).setValues(csvData);

  var csvUrl = "http://csvurlhere";
  var csvContent = UrlFetchApp.fetch(csvUrl).getContentText();
  var csvData = Utilities.parseCsv(csvContent);
  var sheet = SpreadsheetApp.getActive().getSheetByName('Tenants');
  var ss = sheet.getRange(1, 2, csvData.length, csvData[0].length).setValues(csvData);

  var csvUrl = "http://csvurlhere";
  var csvContent = UrlFetchApp.fetch(csvUrl).getContentText();
  var csvData = Utilities.parseCsv(csvContent);
  var sheet = SpreadsheetApp.getActive().getSheetByName('Owners');
  var ss = sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
}

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    要清除工作表的内容或工作表中的一系列单元格,您可以使用sheet.clearContents() 或range.clearContent(),这将只删除值并保留格式和公式。

    我注意到您的行 var ss = SpreadsheetApp.openByUrl('spreadsheeturlhere'); 什么都不做,因为您随后重新声明了 ss 变量。如果脚本绑定到电子表格,则不需要此行,因为对getActive() 和getActiveSheet() 的调用将为您提供对主机电子表格的引用。无论如何,您对 SpreadsheetApp.getActive().getSheetByName() 的调用都会返回对主机电子表格的引用,而不是您通过 URL 打开的引用。

    我还会考虑更改您的函数以接受 CSV 源 URL、工作表名称和单元格锚点作为参数,以便代码更易于维护。例如

    function importCSVFromWeb(csvUrl, sheetName, dataAnchor) {
      /* csvUrl:     the CSV source URL
         sheetName:  the name of the sheet to add the data
         dataAnchor: the cell origin for the range.setValues() call as an array 
                     i.e. dataAnchor = [row, col]
      */
      var csvContent = UrlFetchApp.fetch(csvUrl).getContentText();
      var csvData = Utilities.parseCsv(csvContent);
      var ss = SpreadsheetApp.getActive();
      // note that you'll need to pass in a name for each sheet, 
      //   including the first one where you used SpreadsheetApp().getActiveSheet() previously
      var sheet = ss.getSheetByName(sheetName);
      sheet.getRange(dataAnchor[0], dataAnchor[1], csvData.length, csvData[0].length).setValues(csvData);
    }
    
    function feedCSVImport(){
      var urls_sheets_list = [["csv_source_url_1", "Sheet1", [1,1]],
                              ["csv_source_url_2", "RentPaid", [3,3]],
                              ["csv_source_url_3", "Tenants", [1,2]],
                              ["csv_source_url_4", "Owners", [1,1]]
                             ];
      for(var i = 0, lim = url_sheets_list.length; i < lim; ++i){
        importCSVFromWeb(url_sheets_list[i][0], url_sheets_list[i][1], url_sheets_list[i][2]);
      }
    }
    

    【讨论】:

    • 谢谢。我正在实施这些更改并收到以下错误:“TypeError:无法从未定义中读取属性“0”。(第 23 行,文件“代码”)”第 23 行是:importCSVFromWeb(url_sheets_list.length[i][0], url_sheets_list.length[i][1], url_sheets_list.length[i][2]);
    • 对不起,@Rob。我已经修正了示例中的拼写错误。它并不漂亮,但它旨在展示一种解决问题的方法。
    • 这很好用,感谢@Dean Ransevycz 的帮助。如果我想合并 range.clearContent(),如何将其添加到参数中,以便在输入新内容之前清除范围?
    • 如果要清除所有工作表中的数据,则无需添加新参数。如果您想在粘贴数据之前标记要清除的特定工作表,我只会考虑添加一个布尔参数——您可以基于此调用 clearContent() 方法。看看sheet 类(developers.google.com/apps-script/reference/spreadsheet/sheet),特别是getLastRow() 和getLastColumn() 方法。尝试解决问题并在遇到困难时再问一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多