Google 文档格式化,将文本转换为工作表

Google docs formatting, converting texts into sheets

我已经成功地将 google 文档文件发送到 google sheets 并且 spreadsheet 成功地自行填充(它格式化文字变成了table,很工整)

下面是我如何设置文本格式的示例:

ID, NAME, MOBILE, CITY, COUNTRY, BIRTHDAY, 
3, NameGoesHere1, 21 98658 5548, abcity, countryNameHere, 1998-05-02, 
6, SomeoneElse Joined Here, 21 98535 1218, whereland, Far far away, 1989-11-15, 
5, AnotherCustomer, 21 85482 5245, somecity, Somewhereland, 1999-08-04, 

ID, PRICE, STOCK, ASDF, BASDF, CASDF,

ID, NAME, PRICE, DESCRIPTION, 
2, pen, 1.5, The pen is mightier than the sword, 
3, pencil, 1.0, Can be used to write, 
4, RPG, 150.0, well that escalated quickly, huh, 

EMPTY, 
names, 
goofs, 

ID, FLAVOR, 

(请注意,有两个空的 table,一个以 "ID, PRICE, STOCK, ASDF, BASDF, CASDF" 和 "ID, FLAVOR" 作为它们的列,它们是故意留空的)

在单元格中填充:

=IMPORTDATA("<<< <<<google drive url containing text goes here, just copy-paste>>> >>>")

我能够创建几个 tables,所选单元格位于第一个 table 的左上角,并且该命令将它们全部放入 google sheets 自动格式化。每个 table 都放在前一个下面,从列名开始。


我正在寻找一种在不同的 google-sheet 页面中获取每个 table 的方法,如下所示:

第 1 页:

ID, NAME, MOBILE, CITY, COUNTRY, BIRTHDAY, 
3, NameGoesHere1, 21 98658 5548, abcity, countryNameHere, 1998-05-02, 
6, SomeoneElse Joined Here, 21 98535 1218, whereland, Far far away, 1989-11-15, 
5, AnotherCustomer, 21 85482 5245, somecity, Somewhereland, 1999-08-04, 

第 2 页:

ID, PRICE, STOCK, ASDF, BASDF, CASDF,

第 3 页:

ID, NAME, PRICE, DESCRIPTION, 
2, pen, 1.5, The pen is mightier than the sword, 
3, pencil, 1.0, Can be used to write, 
4, RPG, 150.0, well that escalated quickly, huh, 

等等。

我想知道是否有办法将文本分隔到不同的页面,如上所示,或者将文件类型从文本转换为 sheets 的替代方法是什么,这样我就可以将它分成不同的页面

ps.: 我需要代码在 python 中,因为我正在使用 pydrive 进行文件上传


编辑:由@Tanaike 解决。 注意@Tanaike 解决方案的重要调试:

我想再次感谢@Tanaike,感谢他对我的解决方案的耐心和奉献,以及他在调试方面的帮助。

  • 您有一个如下所示的文本文件。此文本文件放在您的 Google 驱动器中。您知道文本文件的文件 ID。

    ID, NAME, MOBILE, CITY, COUNTRY, BIRTHDAY, 
    3, NameGoesHere1, 21 98658 5548, abcity, countryNameHere, 1998-05-02, 
    6, SomeoneElse Joined Here, 21 98535 1218, whereland, Far far away, 1989-11-15, 
    5, AnotherCustomer, 21 85482 5245, somecity, Somewhereland, 1999-08-04, 
    
    ID, PRICE, STOCK, ASDF, BASDF, CASDF,
    
    ID, NAME, PRICE, DESCRIPTION, 
    2, pen, 1.5, The pen is mightier than the sword, 
    3, pencil, 1.0, Can be used to write, 
    4, RPG, 150.0, well that escalated quickly, huh, 
    
    EMPTY, 
    names, 
    goofs, 
    
    ID, FLAVOR, 
    
  • 您想通过在每个空行中分隔文本数据来将值分配给个人 sheet。

    • 选项卡 1

      ID, NAME, MOBILE, CITY, COUNTRY, BIRTHDAY, 
      3, NameGoesHere1, 21 98658 5548, abcity, countryNameHere, 1998-05-02, 
      6, SomeoneElse Joined Here, 21 98535 1218, whereland, Far far away, 1989-11-15, 
      5, AnotherCustomer, 21 85482 5245, somecity, Somewhereland, 1999-08-04, 
      
    • 选项卡 2

      ID, PRICE, STOCK, ASDF, BASDF, CASDF,
      
    • ...
    • 选项卡 5

      ID, FLAVOR, 
      

如果我的理解是正确的,这个答案怎么样?请将此视为几个可能的答案之一。

问题和解决方法:

我认为您的目标很难或仅靠Spread的内置功能可能无法实现sheet。所以在这个答案中,我想建议使用 Google Apps Script 来实现你的目标。

流量:

该示例脚本的流程如下。

  1. 从文本文件中检索文本数据。
  2. 解析文本数据。
    • 当我看到你的文本数据时,我认为该数据可以解析为CSV数据。
    • 这里把文本数据分开放到每个sheet.
  3. 创建新的点差sheet.
  4. 将解析后的数据放入新的Spreadsheet。
    • 这里,每条数据都放到个人sheet.

用法:

  1. 将以下示例脚本复制并粘贴到 Google Apps 脚本的脚本编辑器中。
    • 届时请将文本文件的文件ID设置为fileId
  2. 运行myFunction()的函数。
    • 脚本为运行时,授权画面打开。所以请授权范围。

这样,脚本就可以工作了。

示例脚本:

function myFunction() {
  var fileId = "###"; // Please set the file ID of text file.
  var newSpreadsheetName = "sampleSpreadsheet"; // Please set new Spreadsheet name.

  var data = DriveApp.getFileById(fileId).getBlob().getDataAsString();
  var temp = [];
  var parsedData = Utilities.parseCsv(data).reduce(function(ar, e, i, d) {
    if (e.join("")) {
      temp.push(e);
    } else {
      ar.push(temp);
      temp = [];
    }
    if (i == d.length - 1) ar.push(temp);
    return ar;
  }, []);
  var ss = SpreadsheetApp.create(newSpreadsheetName);
  parsedData.forEach(function(e, i) {
    var sheet = i == 0 ? ss.getSheets()[0] : ss.insertSheet();
    sheet.getRange(1, 1, e.length, e[0].length).setValues(e);
  })
}

注:

  • 在此示例脚本中,创建了新的 Spreadsheet,并将数据放入每个 sheet。当然,数据可以放到现有的Spreadsheet中。那样的话,就需要修改脚本了。

参考文献:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

已添加:

  • 您想使用 google-api-python-client 和 python.
  • 来实现上述目标
  • 您已经能够使用 python 的驱动器 API 和表格 API。

我可以像上面那样理解。在这种情况下,使用驱动器 API 和工作表 API。驱动器 API 从 Google 驱动器上的文本文件中检索数据。 Sheets API 使用这些值创建新的 Spreadsheet。在这种情况下,为了使用 Sheets API,我使用了 google-api-python-client。通过这个,我还使用了 Drive API 和 google-api-python-client.

示例脚本

fileId = '###'  # Please set the file ID of text file.

sheets = build('sheets', 'v4', credentials=creds)
drive = build('drive', 'v3', credentials=creds)

# Retrieve data from Google Drive and parse data as an array.
data = drive.files().get_media(fileId=fileId).execute()
csvData = [row.split(",") for row in str(data, 'utf-8').split("\n")]
ar = []
temp = []
for i, row in enumerate(csvData):
    if "".join(row) != "":
        row = [v.strip() for v in row]
        temp.append(row)
    else:
        ar.append(temp)
        temp = []
    if i == len(csvData) - 1:
        ar.append(temp)

sheetsObj = []
valuesUpdateReq = []
for i, sheet in enumerate(ar):
    if bool(sheet):
        sheetName = "Sheet" + str(i + 1)
        sheetsObj.append({"properties": {"title": sheetName}})
        valuesUpdateReq.append({"values": sheet, "range": sheetName, "majorDimension": "ROWS"})

# Request to Sheets API.
body = {"properties": {"title": "sampleSpreadsheet"}, "sheets": sheetsObj}
res1 = sheets.spreadsheets().create(body=body).execute()
batch_update_values_request_body = {"data": valuesUpdateReq, "valueInputOption": "USER_ENTERED"}
res2 = sheets.spreadsheets().values().batchUpdate(spreadsheetId=res1["spreadsheetId"], body=batch_update_values_request_body).execute()
print(res2)
  • 当您 运行 脚本时,将从 Google 驱动器检索数据并创建新的 Spreadsheet。在这种情况下,值被放入 Spreadsheet 和 "USER_ENTERED"。通过这种方式,可以将值解析为字符串、数字和日期。而且,不使用字符顶部的单引号。
  • 关于credentials=creds,请检查the Quickstart for python