在用户输入值时,在电子表格中附加行

etu*_*rdu 5 php google-sheets-api

我有一个字符串数组,我需要根据数组的大小将其附加到电子表格中,从第一列到第n列.

字符串可以表示几种类型的值,例如数字,日期等,因此必须在用户输入时将它们放在工作表中以保持其含义.

据我所知,Google API提供了两种附加值的方法,但它们似乎都不适合这种情况.这是我遇到的问题:

使用Google_Service_Sheets_AppendCellsRequest

这种方法的问题是我无法找到一种方法来设置用户输入的值.这是一个代码示例:

  // Build the CellData array
  $values = array();
  foreach( $ary_values AS $d ) {
    $cellData = new Google_Service_Sheets_CellData();
    $value = new Google_Service_Sheets_ExtendedValue();
    $value->setStringValue($d);
    $cellData->setUserEnteredValue($value);
    $values[] = $cellData;
  }
  // Build the RowData
  $rowData = new Google_Service_Sheets_RowData();
  $rowData->setValues($values);
  // Prepare the request
  $append_request = new Google_Service_Sheets_AppendCellsRequest();
  $append_request->setSheetId(0);
  $append_request->setRows($rowData);
  $append_request->setFields('userEnteredValue');
  // Set the request
  $request = new Google_Service_Sheets_Request();
  $request->setAppendCells($append_request);
Run Code Online (Sandbox Code Playgroud)

(完整的工作代码在这里)

即使使用CellData.setUserEnteredValue时,数据被解释为字符串,因为一个具有使用设置值ExtendedValue.setStringValue(或其他支持的方法,即setBoolValue,setFormulaValue,setNumberValue).

使用spreadsheets.values.append

使用这种方法,我可以在用户输入时呈现数据,但在几种情况下,"附加"在错误的位置完成.如文档所述:

输入范围用于搜索现有数据并查找该范围内的"表".值将从表的第一列开始附加到表的下一行.

因此,此方法的行为方式与前一种方法不同,这会给我带来问题.

这是一段应该做我想要的代码:

  $body = new Google_Service_Sheets_ValueRange([
    'values' => [ $array_values ]
  ]);
  $params = [
    'valueInputOption' => 'USER_ENTERED'
  ];
  // the n-th column
  $end_column = chr( ord('A') + count($array_values));
  $result = $sheet_service->spreadsheets_values->append(
    $fileId,
    $sheetName . "!A1:" . $end_column . "1",
    $body,
    $params
  );
Run Code Online (Sandbox Code Playgroud)

实际上,它工作正常,但有一些例外,例如:

  • 如果单元格A1为空,则该append方法将从第2列开始放置值(请参阅此示例以了解原因).
  • 如果我有一些写入的行,然后是空行,然后是其他写入的行,则该append方法将"填补空白",而不是将值放在最后写入的行之后.

我做错了吗?有没有办法用一种或另一种方法制作我想要的东西?

回顾一下:

  • 必须将这些值视为用户输入(例如,数字或日期应解释为此类)
  • 必须在最后一个非空单元格之后的行中写入值,从第一列开始
  • append操作必须是原子的(即发送一个请求以获取最后一个非空单元格行,然后发送另一个请求将数据写入其中,这不是一个选项,因为在此期间另一个用户可以将数据放在那里)

欢迎任何建议!