web-dev-qa-db-ja.com

Google Sheets API:値で行を見つけてコンテンツを更新する方法

Google Spreadsheetをデータベースとして使用するAndroidアプリケーションで作業しています。アプリケーションはSheets API v4を使用して、スプレッドシートの値を取得、追加、更新する必要があります。最初の2つの機能は最初の列(「バッチID」)に特定の値を持つ行を見つけ、この行のすべてのセルを更新する必要があります。

これが私のスプレッドシートの外観です。

現在、次のように行を変更しています:

ValueRange response = this.mySheetsService.spreadsheets().
                values().get(spreadsheetId, range).execute();

List<List<Object>> values = response.getValues();
String rangeToUpdate;

Log.i(TAG, "all values in range: " + values.toString());

int i = 0;
if (values != null) {
    for (List row : values) {
        i += 1;
        if (row.get(0).equals(selectedBatchID)) {
            Log.i(TAG, "IT'S A MATCH! i= " + i);
            rangeToUpdate = "A" + (i + 1) + ":E" + (i + 1); //row to be updated
        }
    }
}
/*once I have the row that needs to be updated, I construct my new ValueRange requestbody and
*execute a values().update(spreadsheetId, rangeToUpdate , requestbody) request.
*/

これは実際にはうまく機能していますが、それはい解決策だと思い、より良いものがあると確信しています。

Sheets APIのドキュメントを読んで、batchUpdateByDataFilterDataFilterValueRangeまたはDeveloperMetadataなどの概念に精通し、これらの機能を使用する必要があると感じています私が達成しようとしていることですが、それらをまとめることができず、例も見つかりませんでした。

誰かが私にこれらのSheets V4の機能の使用方法を見せたり、理解するのを手伝ったりできますか?

ありがとうございました。

18
ferenckovacsx

私はまったく同じ問題を抱えていますが、これまでのところ(2018年3月)Sheets v4 APIは値による検索を許可せず、セルアドレスを返します。 StackOverflowのどこかで見つけた解決策は、式を使用することです。数式は、値で住所を検索するたびに任意のシートに作成できます。その後、数式を消去します。毎回式を削除したくない場合は、多くの場合、非表示のワークシートのような安全な場所に作成することを好みます。

  1. 非表示のワークシートLOOKUP_SHEETを作成します(spreadsheetIdはスプレッドシートIDです):

POST https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId:batchUpdate

{
 "requests": [
  {
   "addSheet": {
    "properties": {
     "hidden": true,
     "title": "LOOKUP_SHEET"
    }
   }
  }
 ]
}
  1. MySheet1シートで「値の検索」を検索する非表示のワークシートのA1セルに数式を作成し、行を取得します。

PUT https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId/values/LOOKUP_SHEET!A1?includeValuesInResponse=true&responseValueRenderOption=UNFORMATTED_VALUE&valueInputOption=USER_ENTERED&fields=updatedData

{
 "range": "LOOKUP_SHEET!A1",
 "values": [
  [
   "=MATCH("Search value", MySheet1!A:A, 0)"
  ]
 ]
}

応答は次のようになります。

{
 "updatedData": {
  "range": "LOOKUP_SHEET!A1",
  "majorDimension": "ROWS",
  "values": [
   [
    3
   ]
  ]
 }
}

デフォルトでは、主要なディメンションはROWSです。 MATCH()は、列A内の相対行を返します。行IDが提供されない場合、この位置は事実上絶対です。または、= ROW(INDIRECT(ADDRESS(MATCH( "Search value"、A:A、0)、1)))のようなより信頼性の高い呼び出しを使用することもできます。シートにスペースが含まれている場合は、一重引用符で囲みます。番号を検索する場合は、引用符で囲まないでください。

24
Rusty Core