17

パブリック (つまり、「Web に公開」され、「Web 上のすべてのユーザー」と共有されている) スプレッドシートに対して実行しているときに、Google Sheets API の v4 から応答を取得できません。

関連ドキュメントには次のように記載されています。

「リクエストが承認を必要としない場合 (公開データのリクエストなど)、アプリケーションは API キーまたは OAuth 2.0 トークン、あるいはその両方を提供する必要があります。最も便利なオプションを選択してください。」

また、API キーを提供するために、ドキュメントには次のように記載されています。

「API キーを取得したら、アプリケーションはクエリ パラメータ key=yourAPIKey をすべてのリクエスト URL に追加できます。」

したがって、次の URL にある公開スプレッドシートにシートを一覧表示した応答を取得できるはずです。

https://sheets.googleapis.com/v4/spreadsheets/ {spreadsheetId}?key={myAPIkey}

(明らかに、パスとクエリ文字列でそれぞれ提供される ID とキーを使用)

ただし、これを行うと、HTTP 401 応答が返されます。

{
  error: {
    code: 401,
    message: "The request does not have valid authentication credentials.",
    status: "UNAUTHENTICATED"
  }
}

他の誰かがこれを公開ワークブックに対して機能させることはできますか? そうでない場合、Google 側からこのスレッドを監視している人は、コメントするか、実際のサンプルを提供できますか?

4

4 に答える 4

6

この問題は最近修正され、現在は機能しているはずです。お手数をおかけしますが、もう一度お試しください。

ドキュメントは、「リンクを知っている全員」または「ウェブ上で公開」に共有する必要があります。(注: v3 API とは異なり、「ファイル -> Web に公開」からの公開設定は関係ありません。)

于 2016-05-19T13:50:48.777 に答える
1

これは問題の解決策ではありませんが、目標を達成するための良い方法だと思います。サイトhttp://embedded-lab.com/blog/post-data-google-sheets-using-esp8266/で、Google Apps Script を使用してスプレッドシートを更新する方法を見つけました。これは GET メソッドを使用した例です。JSON形式のPOSTメソッドを紹介しようと思います。

投稿方法: Google スプレッドシートを作成し、[ツール] > [スクリプト エディター] タブで次のスクリプトを貼り付けます。適切なスプレッドシート ID とシート タブ名を入力して、スクリプトを変更します (スクリプトの 27 行目と 28 行目)。

function doPost(e)
{
  var success = false;
  if (e != null)
  {
    var JSON_RawContent = e.postData.contents;
    var PersonalData = JSON.parse(JSON_RawContent);

    success = SaveData(
      PersonalData.Name, 
      PersonalData.Age, 
      PersonalData.Phone
    );
  }
  // Return plain text Output
    return ContentService.createTextOutput("Data saved: " + success);
}

function SaveData(Name, Age, Phone)
{
  try 
  {
    var dateTime = new Date();

    // Paste the URL of the Google Sheets starting from https thru /edit
    // For e.g.: https://docs.google.com/---YOUR SPREADSHEET ID---/edit 
    var MyPersonalMatrix = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/---YOUR SPREADSHEET ID---/edit");
    var MyBasicPersonalData = MyPersonalMatrix.getSheetByName("BasicPersonalData");


    // Get last edited row
    var row = MyBasicPersonalData.getLastRow() + 1;

    MyBasicPersonalData.getRange("A" + row).setValue(Name);
    MyBasicPersonalData.getRange("B" + row).setValue(Age); 
    MyBasicPersonalData.getRange("C" + row).setValue(Phone); 

    return true;
  }
  catch(error) 
  {
    return false;
  }
}

スクリプトを保存し、タブPublish > Deploy as Web Appに移動します。

Me xyz@gmail.comとしてアプリを実行します。

誰がアプリにアクセスできるか:匿名でも誰でも

次に、Postman アプリを使用してテストします。ここに画像の説明を入力

または UWP を使用して:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    using (HttpClient httpClient = new HttpClient())
    {
        httpClient.BaseAddress = new Uri(@"https://script.google.com/");
        httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
        httpClient.DefaultRequestHeaders.AcceptEncoding.Add(new System.Net.Http.Headers.StringWithQualityHeaderValue("utf-8"));
        string endpoint = @"/macros/s/---YOUR SCRIPT ID---/exec";

        try
        {
            PersonalData personalData = new PersonalData();
            personalData.Name = "Jarek";
            personalData.Age = "34";
            personalData.Phone = "111 222 333";

            HttpContent httpContent = new StringContent(JsonConvert.SerializeObject(personalData), Encoding.UTF8, "application/json");
            HttpResponseMessage httpResponseMessage = await httpClient.PostAsync(endpoint, httpContent);
            if (httpResponseMessage.IsSuccessStatusCode)
            {
                string jsonResponse = await httpResponseMessage.Content.ReadAsStringAsync();
            //do something with json response here
            }
        }
        catch (Exception ex)
        {

        }
    }
}

public class PersonalData
{
    public string Name;
    public string Age;
    public string Phone;
}

上記のコードには NuGet Newtonsoft.Json が必要です。

結果: ここに画像の説明を入力

于 2018-03-24T00:15:22.160 に答える