[C#]Google Sheets Apiでシートを行追加で更新する(Service Account)

C#

Google Sheets Apiを使って、シートを更新していく方法を記載しています。
既に行があれば、その下から追加してくれる便利なモードがあるので、Azure FunctionsでC#を使って書いてみました。

Google Sheets Apiで追記してみた

Service Accountを使って、追記していくコードを書いてみました。
Service Accountの設定方法などは、こちらの記事をご確認ください。

Service Accountのアクセスキーを取得して、プロジェクト配下に置いて、「常にコピーする」設定にしておけば準備完了です。

コード

namespace poc_azure_function.Controllers
{
    public class SpreadSheetServiceAccountController
    {
        private SheetsService _sheetsService;
        private DriveService _driveService;
        public string _editSpreadsheetId = "{spread_sheets_id}";
        public string _parentFolderId = "{parent_folder_id}";

        /// <summary>
        /// Service AccountでGoogle Spread SheetにアクセスするためのSheetsServiceを返す
        /// </summary>
        /// <returns></returns>
        private SheetsService ConnectSpreadSheet()
        {
            GoogleCredential credential;
            string[] scopes = { SheetsService.Scope.Spreadsheets }; 
            using (var stream = new FileStream("service-account-key.json", FileMode.Open, FileAccess.Read))
            {
                credential = GoogleCredential.FromStream(stream).CreateScoped(scopes);
            }
            return new SheetsService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = "codelike spread seets connect",
            });
        }

        /// <summary>
        /// Service AccountでSpread Sheetに追記処理
        /// </summary>
        /// <param name="req"></param>
        /// <param name="log"></param>
        /// <returns></returns>
        [FunctionName("SaSpreadAppend")]
        public IActionResult SpreadAppend(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "sa_spread_append")] HttpRequest req, ILogger log)
        {
            _sheetsService = ConnectSpreadSheet();
            string range = "Sheet1!B2";
            var valueInputOption = (SpreadsheetsResource.ValuesResource.AppendRequest.ValueInputOptionEnum)2;
            var insertDataOption = (SpreadsheetsResource.ValuesResource.AppendRequest.InsertDataOptionEnum)1;

            Data.ValueRange requestBody = new Data.ValueRange();
            List<IList<object>> data = new List<IList<object>>();
            data.Add(GetAppendList());
            data.Add(GetAppendList());
            data.Add(GetAppendList());
            data.Add(GetAppendList());
            data.Add(GetAppendList());
            requestBody.Values = data;
            SpreadsheetsResource.ValuesResource.AppendRequest request = _sheetsService.Spreadsheets.Values.Append(requestBody, _editSpreadsheetId, range);
            request.ValueInputOption = valueInputOption;
            request.InsertDataOption = insertDataOption;

            Data.AppendValuesResponse response = request.Execute();

            return new ObjectResult(JsonConvert.SerializeObject(response));
        }

        private List<object> GetAppendList()
        {
            var list = new List<object>
            {
                "append1",
                "append2",
                "append3",
                "append4",
                "append5",
            };
            return list;
        }        
    }
}

解説

38-58行目にアクセスされてから、動作する処理になります。
39行目のConnectSpreadSheetでSpread Sheetにアクセスするための、SheetsServiceインスタンスを取得しています。

40-42行目は設定値を用意しています。
更新するシート名・更新位置と更新オプションを設定しています。シート名が違うとエラーになるので注意が必要です。

44-54行目でリクエストとしてAPIに渡すパラメータを作成していて、45-51行目でシートを更新する値を作って設定しています。

53・54行目が更新する時のオプションです。
ValueInputOptionには2(USER_ENTERED)を設定していて、これはユーザーが入力した時と同じように更新値が扱われます。
他のValueInputOptionは公式のこちらを確認してみてください。

InsertDataOptionには1(INSERT_ROWS)を設定していて、これが値を新しい行として追加してくれる設定です。
シート更新位置に同じデータがあると、データがない行から追加してくれます。
0がOVERWRITEで書き込まれたデータは上書きされる設定になります。

56行目で更新APIを実行して、レスポンスを受け取っています。

動作確認

シートが最初はまっさらですが…

postmanからapiを叩くと…

設定した値で更新されました😙

github

こちらに今回のサンプルを置いています。(他のメソッド検証で書いたコードも混ざってますが…)
YasuakiHirano/poc-azure-function
azure function test repository. Contribute to YasuakiHirano/poc-azure-function development by creating an account on GitHub.

コメント

タイトルとURLをコピーしました