谷歌文档格式化,将文本转换为表单

2024-09-27 00:23:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我成功地将google文档文件发送到google sheets中,电子表格能够正确填写(它将文本格式化为表格,非常整洁)

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

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, 

(请注意,有两个空表,一个是“ID,PRICE,STOCK,ASDF,BASDF,CASDF”和“ID,FLAVOR”列,故意将它们留空)

通过在单元格中填充:

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

我能够创建多个表格,其中选定的单元格位于第一个表格的左上角,并且该命令会自动将所有表格放入GoogleSheets格式。每个表都位于前一个表的下方,从列名开始


我正在寻找一种方法,以在不同的google工作表页面中获取每个表,如下所示:

第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, 

等等

我想知道是否有一种方法可以像上面所示将文本分割成不同的页面,或者有什么替代方法可以将文件类型从文本转换成工作表,这样我就可以将其分割成不同的页面

ps:我需要用python编写代码,因为我正在使用pydrive上传文件


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

  • 必须使用列表格式设置作用域,每个url位于不同的列表索引中
  • 确保.txt的格式为每页两个,下一行为一个
  • 如果由于任何原因您的凭据无效,请在开始恐慌之前重新检查“credentials.json”或“client_secrets.json”

我想再次感谢@Tanaike,感谢他对我的解决方案的耐心和奉献,感谢他在调试过程中的帮助


Tags: 方法name文本id格式stockgoogle页面
1条回答
网友
1楼 · 发布于 2024-09-27 00:23:19
  • 您有一个如下所示的文本文件。此文本文件放在您的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, 
    
  • 您希望通过分隔每一空行的文本数据,将值放入单个工作表中

    • 表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, 
      

如果我的理解是正确的,那么这个答案呢?请把这看作是几个可能的答案之一

问题和解决方法:

我认为您的目标很难实现,或者仅仅通过电子表格的内置功能可能无法实现。所以在这个答案中,我想建议使用谷歌应用程序脚本来实现您的目标

流量:

此示例脚本的流程如下所示

  1. 从文本文件中检索文本数据
  2. 解析文本数据。
    • 当我看到您的文本数据时,我认为数据可以解析为CSV数据
    • 在这里,文本数据是分开的,以便放在每张纸上
  3. 创建新的电子表格
  4. 将解析后的数据放入新的电子表格。
    • 在这里,每个数据都放在单独的工作表中

用法:

  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);
  })
}

注:

  • 在此示例脚本中,将创建新的电子表格,并将数据放入每个工作表中。当然,数据可以放在现有的电子表格中。在这种情况下,需要修改脚本

参考文献:

如果我误解了你的问题,而这不是你想要的方向,我道歉

增加:

  • 您希望通过使用带有python的google api python客户端来实现上述目标
  • 您已经能够使用python使用驱动器API和工作表API

我可以像上面那样理解。在这种情况下,将使用驱动器API和工作表API。驱动器API从Google驱动器上的文本文件检索数据。Sheets API使用这些值创建新的电子表格。在本例中,为了使用Sheets API,我使用了google API python客户端。因此,我还将驱动API与google API python客户端一起使用

示例脚本

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 Drive检索数据,并创建新的电子表格。在这种情况下,这些值将以“用户输入”的形式放入电子表格中。通过这种方式,可以将值解析为字符串、数字和日期。而且,不使用字符顶部的单引号
  • 关于credentials=creds,请查看the Quickstart for python

相关问题 更多 >

    热门问题