Google スプレッドシート: 行データ, 単一行TSVで更新
Google スプレッドシート: 行データ, 単一行TSVで更新 (Google Sheets: Sheet Row, Update with Singleline TSV)
単一行TSVデータでGoogleシートを更新します。TSVの先頭値と完全一致するAセルを探索し、最初に合致した行について上書きします。それぞれ値は、手入力した際と同様に自動解析されます。もし合致する行が無い場合は、末尾追記されます。
Configs
  • A: 通信許可設定(OAuth2)を選択してください *
  • B: 単一行 TSV データをセットしてください *#{EL}
  • C: データ更新先のドキュメントID(Spreadsheet ID)をセットしてください *#{EL}
  • D: データ更新先のシート名をセットしてください#{EL}
Script (click to open)
// GraalJS Script (engine type: 2)
/*
NOTES
- Refers and updates the first visible sheet if sheet name is not specified.
- If row deletion or sort is performed at the same time, different record may be updated.
- When the maximum row of the sheet is reached, an error will occur. (Not appended)
- If no data in column A, an error will occur. (Not appended)

- シート名が無指定の場合、先頭シート(表示されているもの)を参照・更新します。
- 同時に、行削除や並替処理がなされた場合、異なるレコードが更新されてしまう可能性があります。
- シートの最大行に達した際は、エラー終了します(追記されません)
- A列に1つのデータも存在しない場合は、エラー終了します(追記されません)
*/

//////// START "main()" /////////////////////////////////////////////////////////////////
main();
function main(){ 

//// == Config Retrieving / 工程コンフィグの参照 ==
const strOauthSetting       = configs.get( "OAuth2ConfA" );   // required
const strSingleTsv          = configs.get( "StrConfB" ) + ""; // required
const strDocId              = configs.get( "StrConfC" ) + ""; // required
let   strSheetName          = configs.get( "StrConfD" ) + ""; // required

if( strSingleTsv === "" ){
  throw new Error( "\n AutomatedTask ConfigError:" +
                   " Config {B TSV} not specified \n" );
}
if( strDocId === "" ){
  throw new Error( "\n AutomatedTask ConfigError:" +
                   " Config {C Spreadsheet ID} not specified \n" );
}
if( strSheetName === "" ){
  engine.log( " AutomatedTask ConfigWarning:" +
              " Config {E Sheet Name} is empty, the first visible sheet is refered" );
}


//// == Data Retrieving / ワークフローデータの参照 ==
// (nothing)


//// == Calculating / 演算 ==

//// Check Tsv Dataset
const arrTsvCells = strSingleTsv.split("\t");
engine.log( " AutomatedTask Singleline TSV Loaded: Number of Columns " + arrTsvCells.length );


//// Get CellValues from the Sheet (Api Request 1)

// prepare request1
// ref) https://developers.google.com
//            /sheets/api/reference/rest/v4/spreadsheets.values/get
const token  = httpClient.getOAuth2Token( strOauthSetting );
let strRange = strSheetName ? (strSheetName + "!A:A") : "A:A";
engine.log( " AutomatedTask Range to Get: " + strRange );
let getUri1  = "https://sheets.googleapis.com/v4/spreadsheets/" +
                strDocId + "/values/" + strRange;
let request1 = httpClient.begin(); // HttpRequestWrapper
    request1 = request1.bearer( token );
    request1 = request1.queryParam( "majorDimension", "ROWS" ); 
    request1 = request1.queryParam( "valueRenderOption", "FORMATTED_VALUE" ); 
               // If formatted as currency, return "$1.23" not "1.23".
    request1 = request1.queryParam( "dateTimeRenderOption", "FORMATTED_STRING" ); 
               // Date as strings (the spreadsheet locale) not SERIAL_NUMBER
engine.log( " AutomatedTask ApiRequest1 Prepared" );

// request1
const response1     = request1.get( getUri1 ); // HttpResponseWrapper
engine.log( " AutomatedTask ApiRequest1 Start: " + getUri1 );
const response1Code = response1.getStatusCode() + ""; // (primitive string)
const response1Body = response1.getResponseAsString() + "";
engine.log( " AutomatedTask ApiResponse Status: " + response1Code );
if( response1Code !== "200"){
  throw new Error( "\n AutomatedTask UnexpectedResponseError: " +
                    response1Code + "\n" + response1Body + "\n" );
}

// parse response1
/* engine.log( response2Body ); // debug
response sample
{
  "range": "'country-code'!A1:A1000",
  "majorDimension": "ROWS",
  "values": [
    [
      "Afghanistan"
    ],
    [
      "Aland Islands"
    ],
    [
      "Zimbabwe"
    ]
  ]
}
*/
const response1Obj = JSON.parse( response1Body );

if(! 'values' in response1Obj){
  throw new Error( "\n AutomatedTask UnexpectedSheetError: " +
                    "No Value in " + strRange + "\n" );
}
engine.log( " AutomatedTask ApiResponse #of Values: " + response1Obj.values.length );
let arrColAValues  = new Array( response1Obj.values.length );
for( let i = 0; i < response1Obj.values.length; i++ ){
  arrColAValues[i] = response1Obj.values[i] ? response1Obj.values[i][0] : "";
}


//// Search "arrTsvCells[0]" in "arrColAValues"
let numMatched = arrColAValues.length; // NoMatch Case
for( let i = 0; i < arrColAValues.length; i++ ){
  if( arrColAValues[i] === arrTsvCells[0] ){
    numMatched = i;  // Match Case
    break;
  }
}


//// Update Values of the Sheet (Api Request 2)

// prepare request2
// ref) https://developers.google.com
//            /sheets/api/reference/rest/v4/spreadsheets.values/update
let strRange2 = strSheetName ?
                strSheetName + "!" + (numMatched + 1) + ":" + (numMatched + 1) :
                (numMatched + 1) + ":" + (numMatched + 1);
engine.log( " AutomatedTask Range to Update: " + strRange2 );
let request2Obj = {};
    request2Obj.values = [];
    request2Obj.values[0] = strSingleTsv.split("\t");
let request2 = httpClient.begin(); // HttpRequestWrapper
    request2 = request2.bearer( token );
    request2 = request2.queryParam( "valueInputOption", "USER_ENTERED" ); 
    request2 = request2.body( JSON.stringify( request2Obj ), "application/json" );
engine.log( " AutomatedTask ApiRequest2 Prepared" );

// request2
let   putUri2       = "https://sheets.googleapis.com/v4/spreadsheets/" +
                       strDocId + "/values/" + strRange2;
const response2     = request2.put( putUri2 ); // HttpResponseWrapper
engine.log( " AutomatedTask ApiRequest2 Start: " + putUri2 );
const response2Code = response2.getStatusCode() + ""; // (primitive string)
const response2Body = response2.getResponseAsString() + "";
engine.log( " AutomatedTask ApiResponse Status: " + response2Code );
if( response2Code !== "200"){
  throw new Error( "\n AutomatedTask UnexpectedResponseError: " +
                    response2Code + "\n" + response2Body + "\n" );
}


//// == Data Updating / ワークフローデータへの代入 ==
// (nothing)


} //////// END "main()" /////////////////////////////////////////////////////////////////



/*
APPENDIX
- "SpreadsheetID" and "SheetID" in URL
    - https://docs.google.com/spreadsheets/d/SPREADSHEETID/edit#gid=SHEETID
- To Get "ClientId" and "Secret"
    - Access to https://console.developers.google.com/apis/credentials
- This request requires authorization with at least one of the following scopes:
    - https://www.googleapis.com/auth/drive
    - https://www.googleapis.com/auth/drive.file
    - https://www.googleapis.com/auth/spreadsheets
- OAuth Setting sample
    - "Authorization Endpoint URL"
        - https://accounts.google.com/o/oauth2/auth?access_type=offline&approval_prompt=force
    - "Token Endpoint URL"
        - https://accounts.google.com/o/oauth2/token
    - "Scope"
        - https://www.googleapis.com/auth/spreadsheets
- Error Log sample (wrong SheetName)
    - "message": "Unable to parse range: NonExistName!A:A",
    - "status": "INVALID_ARGUMENT"
- Error Log sample (Need to expand editing area)
    "message": "Range ('Sheet1'!1001) exceeds grid limits. Max rows: 1000, max columns: 26",
*/

Download

2020-10-27 (C) Questetra, Inc. (MIT License)
https://support.questetra.com/ja/addons/google-sheets-sheet-row-update-with-singleline-tsv/
Addonファイルのインポートは Professional もしくは Enterprise でのみご利用いただけます

Notes

  • シート名が無指定の場合、先頭シート(表示されているもの)を参照・更新します。
  • 同時に、行削除や並替処理がなされた場合、異なるレコードが更新されてしまう可能性があります。
  • シートの最大行に達した際は、エラー終了します(追記されません)
  • A列に1つのデータも存在しない場合は、エラー終了します(追記されません)

Capture

単一行TSVデータでGoogleシートを更新します。TSVの先頭値と完全一致するAセルを探索し、最初に合致した行について上書きします。それぞれ値は、手入力した際と同様に自動解析されます。もし合致する行が無い場合は、末尾追記されます。

Appendix

See also

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

%d人のブロガーが「いいね」をつけました。