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

时间:2018-04-20 13:44:24

标签: 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);

(完整工作代码为here

即使使用CellData.setUserEnteredValue,数据也会被解释为字符串,因为必须使用ExtendedValue.setStringValue(或其他支持的方法,即setBoolValuesetFormulaValue来设置值, setNumberValue)。

使用spreadsheets.values.append

使用此方法我可以在用户输入时呈现数据,但在几种情况下,“附加”在错误的位置完成。如the documentation中所述:

  

输入范围用于搜索   现有数据并找到该范围内的“表格”。价值观将是   附加到表的下一行,从第一列开始   该表。

因此,这种方法的行为与前一种方法不同,这对我来说会产生问题。

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

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

事实上,它运作良好但有一些例外,例如:

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

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

回顾一下:

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

欢迎任何建议!

0 个答案:

没有答案