C#でGoogle Sheets Apiを使って行を追加する!
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を叩くと…
設定した値で更新されました😙
コメント