【问题标题】:How to use .find() to locate a cell and start updating cells in rows below in loop?如何使用 .find() 定位单元格并开始在循环中更新下面行中的单元格?
【发布时间】:2021-04-12 22:24:51
【问题描述】:

我正在使用从 CSV 获取的数据自动填写 Google 表格。对于自动化,我希望能够使用.find() 来定位特定的单元格值,该单元格值用作开始更新单元格的参考。为了更好地解释:

我的代码使用.find('Cafe Crepe') 来定位属于餐厅“Cafe Crepe”的行和列。在表格中有多个餐厅,其下方的订单、小计等格式相同。

def matchAndWriteFinalCSV(self, sheet, restaurant):
        '''
        Match orders from Ecwid csv to restaurant in Delivery csv
        Write to Final csv
        '''
        print("WRITE START")
        cell = sheet.find(f"{restaurant}")
        filtered_list = [] 
        print("WRITE SHEET")
        print(f"ROW {cell.row} COL {cell.col} CELL {cell}")
        sheet.update('R5', "TEST")

更新

为了说明结果应该是什么:

我决定创建一个订单字典列表(订单编号、小计、tx 等)。使用for 循环,我将编写/更新谷歌表的任务按餐厅划分。在此问题的示例中:我的代码获取属于“Cafe Crepe”的所有订单并开始写入/更新订单#、小计、税等字段。

for restaurant_name, restaurant_orders in orders_per_restaurant.items():
            new_row = 5
            for order in restaurant_orders:
                print(order)
                restaurant = restaurant_name
                cell = sheet.find(f"{restaurant}") 
                print(f"ROW {cell.row} COL {cell.col} CELL {cell}") 
                subtotal = cell.col + 1 
                tax = cell.col + 2
                new_cellrow = cell.row + new_row
                write_cell_start = f"R{str(new_cellrow)}C{str(cell.col)}"
                write_subtotal = f"R{str(new_cellrow)}C{str(subtotal)}"
                sheet.update(write_cell_start, order['order'])
                sheet.update(write_subtotal, order['sub-total'])
                new_row += 1
            new_row =  5
            time.sleep(100)

这行得通,但现在如果没有得到"Quota exceeded for quota metric 'Write requests' and limit 'Write requests per minute per user' of service 'sheets.googleapis.com',我无法让这段代码运行超过某个点。我试图了解如何使用batch_update() 实现相同的目标。如何解决我的代码中超过每分钟请求率的问题?

【问题讨论】:

  • 很遗憾,来自I want to be able to .find() to find the restaurant cell and start updating in the cell highlighted blue in the example above. How can I use cell = sheet.find(f"{restaurant}") as a reference to start updating the cells 5 rows below?,我无法理解您的目标。我为我糟糕的英语水平道歉。我可以问你目标的细节吗?如果可以,能否提供您期望的示例输入输出情况?
  • @Tanaike 将更新我的问题以更明确我的目标。
  • 感谢您的回复。我不得不为我糟糕的英语水平道歉。不幸的是,从您更新的问题中,我仍然无法理解您的问题。但我想试着理解它。当我能正确理解它时,我想考虑解决方案。非常抱歉,我无法尽快解决您的问题。
  • @Tanaike 所以我希望能够识别使用sheet.update 的行和列,并在餐厅名称单元格下写入订单编号、小计、税等。因此,通过使用.find(),我得到例如ROW 2 COL 28 CELL <Cell R2C28 'Cafe Crepe'>。我不知道如何使用它来开始更新位于使用.find() 的餐厅名称单元格下方的订单编号、小计等单元格。也许这有助于澄清我正在尝试做的事情。
  • 感谢您回复并添加更多信息。我有个问题。你的样本图片是样本输入的情况?如果我的理解是正确的,你能提供使用样本输入情况时的样本输出情况吗?借此,我想尝试了解您的目标。

标签: python google-sheets gspread


【解决方案1】:

这应该会引导你去你想去的地方:

iRow = Sheet.cells.find("searchString").Row
iCol = Sheet.cells.find("searchString").Column

newCell = Sheet.cells(iRow,iCol).offset(iiRow, iiCol)

iiRow 和 iiCol 可以是您在使用 iRow、iCol 作为基线参考点的新循环中定义的迭代器。

【讨论】:

  • 要在我的代码中应用它,我应该在 iRow 中搜索餐厅名称,而在 iCol 中,它将是诸如 order num 之类的字段?
  • 好吧,我想你可以 - 但我原本打算 iRow 和 iCol 应该从 .find({Restaraunt}) 返回 - 然后,如果你想使用的数据距离 { 有 5 列Restaurant},您将使用 iiCol = 5。(或将固定偏移量设为 5,并使用 iiCol 的迭代器在一系列列中移动。
  • 是的,让我问你,所以我要解决的一个大问题是:对于这种自动化,我正在解析一个满是餐馆订单的 CSV 表。现在,在解析订单时,我正在写信给 Google 工作表。我正在考虑跟踪每家餐厅的索引。但我试图简化这一点。有什么想法吗?
  • 如果没有看到您的数据,我不知道从哪里开始。如果您尝试过但没有成功,请提出一个新问题,以便每个人都可以查看。
  • 无法弄清楚如何使用偏移量。如果我这样做sheet.cell(iRow,iCol).offset(1, 5) 我会得到AttributeError: 'Cell' object has no attribute 'offset'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 2017-11-20
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多