繁体   English   中英

谷歌脚本只导入少数带有脚本的列

google script import only few column with script

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

有一个包含大量列和原始数据的 CSV 文件 但是,我只想导入一些列 我在下面的网络上找到的链接中使用了这个脚本。 它可以工作,但它会导入包含所有列和行的完整文件。 我只需要导入几列而不是全部。 例如:第 1 列、第 5 列、第 20 列有人可以帮助我吗?

https://bionicteaching.com/importing-csv-into-google-sheets-via-google-script/comment-page-1/

1 个回复

我相信你的目标如下。

  • 您想从 URL 检索 CSV 数据。
  • 您想通过检索特定列将 CSV 数据放入 Google 电子表格。
  • 您想使用 Google Apps 脚本来实现这一点。
    • 当我在您的问题中看到https://bionicteaching.com/importing-csv-into-google-sheets-via-google-script/comment-page-1/的 URL 时,我了解到该脚本是 Google Apps 脚本。
  • 您正在使用https://bionicteaching.com/importing-csv-into-google-sheets-via-google-script/comment-page-1/的脚本。

改装要点:

  • 在当前阶段, Utilities.parseCsv()可用于将 CSV 数据解析为数组。 使用此方法时,可以将 CSV 数据解析为二维数组。 我认为这可能可以使用。
  • 为了检索特定的列,我认为可以从CSV数据解析的数组中检索它。

当以上几点反映到脚本中时,它变成如下。

示例脚本:

请将以下脚本复制并粘贴到 Google 电子表格的脚本编辑器中。 并且,请设置变量,然后运行myFunction 这样,检索特定列的 CSV 数据将被放入活动工作表中。

function myFunction() {
  // 1. Set the required columns as the column number.
  const requiredColumns = [1, 5, 20]; // Please set the required columns. These values are from your question.

  // 2. Retrieve CSV data from an URL.
  const url = '###'; // Please set the direct link of CSV data.
  const res = UrlFetchApp.fetch(url);

  // 3. Parse CSV data.
  const ar = Utilities.parseCsv(res.getContentText());

  // 4. Retrieve the required columns from the CSV data.
  const values = ar.map(r => requiredColumns.map(i => r[i]));

  // 5. Put the values to the active sheet.
  const sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange(1, 1, values.length, values[0].length).setValues(values);
}
  • 如果你的CSV数据使用了特定的分隔符,请修改const ar = Utilities.parseCsv(res.getContentText()); const ar = Utilities.parseCsv(res.getContentText(), "delimiter"); . 参考

注意:

  • 当您想将脚本作为自定义函数运行时,您也可以使用以下脚本。 在这种情况下,请将=SAMPLE("URL","1,5,20")单元格。 这样,检索特定列的 CSV 数据就被放入了。

     function SAMPLE(url, columns) { const requiredColumns = columns.split(","); const res = UrlFetchApp.fetch(url); return Utilities.parseCsv(res.getContentText()).map(r => requiredColumns.map(i => r[i.trim()])); }

参考资料:

添加1:

从您提供的示例 CSV 数据中,我可以了解问题的原因。 我认为在这种情况下,上述方法的 CSV 数据大小可能很大。 由此,我认为可能会发生此类错误。 当我检查 CSV 数据时,发现它有 4,763,515 个单元格,42,155 行和 113 列。 所以,为了消除这个问题,我想提出如下的第二个示例脚本。

在此示例中,首先使用 Drive API 将 CSV 数据转换为电子表格,然后使用 Sheets API 删除除所需列之外的列,然后将工作表复制到活动电子表格中。

示例脚本:

在使用此脚本之前, 请在高级 Google 服务中启用 Drive API 和 Sheets API 由于数据量大,我使用了 Drive API 和 Sheets API。

function myFunction2() {
  // 1. Set the required columns as the column number.
  const requiredColumns = [1, 5, 20]; // Please set the required columns. These values are from your question.

  // 2. Retrieve CSV data from an URL.  
  const url = "https://www.stanem.it/csv/InnovaCSV.csv";  // This is from your sample CSV data.
  const res = UrlFetchApp.fetch(url);

  // 3. Convert CSV data to Spreadsheet.
  const id = Drive.Files.insert({mimeType: MimeType.GOOGLE_SHEETS, title: "tempSpreadsheet"}, res.getBlob()).id;

  // 4. Delete the columns except for the required columns.
  const ss = SpreadsheetApp.openById(id);
  const sheet = ss.getSheets()[0];
  const maxColumn = sheet.getMaxColumns();
  const requests = [];  
  for (let i = 1; i <= maxColumn; i++) {
    if (!requiredColumns.includes(i)) {
      requests.push({deleteDimension: {range: {sheetId: sheet.getSheetId(), dimension: "COLUMNS", startIndex: i - 1, endIndex: i}}});
    }
  }
  Sheets.Spreadsheets.batchUpdate({requests: requests.reverse()}, id);

  // 5. Copy the sheet including CSV data to the active Spreadsheet.
  const dstss = SpreadsheetApp.getActiveSpreadsheet();
  sheet.copyTo(dstss).setName("sheetIncludingCSV");
  
  // 6. Remove the temporat Spreadsheet.
  DriveApp.getFileById(id).setTrashed(true);
}

添加2:

对不起这个sheet.copyTo(dstss); 有效,但它为我创建了很多副本表,我只需要一张始终同名的表

从你的回复上面,我为此修改了上面的脚本。

示例脚本:

function myFunction3() {
  // 1. Set the required columns as the column number.
  const requiredColumns = [1, 5, 20]; // Please set the required columns. These values are from your question.

  // 2. Retrieve CSV data from an URL.  
  const url = "https://www.stanem.it/csv/InnovaCSV.csv";
  const res = UrlFetchApp.fetch(url);

  // 3. Convert CSV data to Spreadsheet.
  const id = Drive.Files.insert({mimeType: MimeType.GOOGLE_SHEETS, title: "tempSpreadsheet"}, res.getBlob()).id;

  // 4. Delete the columns except for the required columns.
  const ss = SpreadsheetApp.openById(id);
  const sheet = ss.getSheets()[0];
  const maxColumn = sheet.getMaxColumns();
  const requests = [];  
  for (let i = 1; i <= maxColumn; i++) {
    if (!requiredColumns.includes(i)) {
      requests.push({deleteDimension: {range: {sheetId: sheet.getSheetId(), dimension: "COLUMNS", startIndex: i - 1, endIndex: i}}});
    }
  }
  Sheets.Spreadsheets.batchUpdate({requests: requests.reverse()}, id);

  // 5. Copy the values of modified CSV data to a sheet in the active Spreadsheet.
  const destinationSheetName = "Sheet1";  // Please set the destilnation sheet name in the active Spreadsheet.
  const dstss = SpreadsheetApp.getActiveSpreadsheet();
  const values = Sheets.Spreadsheets.Values.get(id, sheet.getSheetName()).values;
  Sheets.Spreadsheets.Values.update({values: values}, dstss.getId(), destinationSheetName, {valueInputOption: "USER_ENTERED"});
  
  // 6. Remove the temporat Spreadsheet.
  DriveApp.getFileById(id).setTrashed(true);
}
  • 此示例脚本将修改后的 CSV 数据放入活动电子表格的特定工作表中。
  • 在这种情况下,值来自第一行和第一列。 所以当你想放置其他范围时,请修改脚本。
2 带有脚本的Googlesheet

在此处输入图片说明 大家好,我想在L列中创建完整的脚本:“默认”,当C:C不为空并且L列中的一个单元为空时。 请帮忙! ...

3 带有脚本的网页

请对我耐心,我从来没有非常喜欢编码(只是在大学里一点点),但这是我很想拥有的一件事。 在问起我什至不知道要搜索的内容之前,我还没有做过任何研究:)但是这是我想做的: 我有连接了多播电视流的Synology设备。 我已经安装了ffmpeg,每次想录制电视节目时,都必须通过CLI进行,所以 ...

2017-04-28 07:07:10 1 43   ffmpeg
4 Laravel dd输出仅带有脚本

带有脚本标记的dd('asd')的响应,而不是纯字符串。 对于其他php变量, dd()的输出也仅带有脚本标记(没有html标记)。 因此,它的预览看起来也像响应一样。 我正在使用wampserver 3.1.0。早期它与php 7.1工作正常,但当我切换到7.0时,这个问题正在发生。 ...

5 带有脚本的备份设备

我有这个脚本: 该脚本读取bk-SMB.txt文件,并将变量(逐行)之类的内容传递给bk-SMB.sh,它可以工作,但由于我拥有135台设备(并且正在增加),因此需要花费很多时间。 如何改善脚本以减少时间? 例如:分批传递变量。 感谢您的想法和帮助。 ...

6 我可以将脚本链接到已经有脚本的谷歌表格吗?

我有一个谷歌表,它链接到一个表单和一个在谷歌表菜单中创建的谷歌脚本。 这个脚本运行良好,我用它来格式化数据。 但是,我有另一个从 google 开发者控制台创建的脚本,它从网站发送和接收数据。 我需要第二个脚本来获取 Google 表格中单元格的值。 如何在保持脚本已链接到工作表的同时将第二种形式链 ...

7 使用带有脚本标签的 fullcalendar/icalendar

对不起,如果这是一个超级基本的问题,但我想使用 fullcalendar 的icalendar包,使用脚本标签。 我看到 icalendar 不在pre-built bundles 列表中,但我希望它仍然是可能的。 我的问题是我不确定如何导入插件(这一行plugins: [DayGridPlug ...

8 带有vmware映像的IBM InfoSphere BigInsights没有脚本

我正在尝试使用IBM的vmware映像安装IBM InfoSphere BigInsights,我已成功加载该映像,并且根据此文档biginsight自述文件显示了redhat屏幕 一切运行正常,但在桌面上没有显示“启动BigInsight服务”图标。 但是安装了webconsole和e ...

9 带有脚本的jQuery .load()

我知道有人问过这个问题,但没有找到满意的答案。 我有一个非常简单的html页面,我想将其加载到许多其他页面中。 没问题,但是我遇到的问题是,此html页面具有一个jQuery悬停功能,该功能根本不会在其他页面上执行。 我试过将悬停功能放在每个页面上,我试过了.getScript。 据我了 ...

暂无
暂无

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

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