Google Code Prettify

2017年3月11日 星期六

[Android + Google SpreadSheet] 寫入Google SpreadSheet

這次要介紹APP 寫資料至Google SpreadSheet
這次的寫法跟以往不同,是經由 Google問卷的方式寫入SpreadSheet
不過只能新增,沒有辦法做更新修改及刪除動作。




  • 第一步,先建立Google問卷,建立兩個問題



  • 到預覽表單按右鍵->檢視網頁原始碼





  • 原始碼中,
  1. 搜尋 <form,複製action中的字串
  2. 搜尋 entry,第一個TextBox,如上圖的TestName,複製 entry.XXXXX
  3. 搜尋 entry,第二個TextBox,如上圖的Test,複製 entry.XXXXX



    • 完成後建立回應目的地->SpreadSheet(回應)




    舊版介面



    新版介面



    Android Studio

    AndroidManifest.xml

    • 新增權限
     <uses-permission android:name="android.permission.INTERNET" />

    Layout

    <CheckBox
            android:id="@+id/question_cats_input"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Do you like cats?"
            android:layout_marginTop="33dp"
            android:layout_below="@+id/editText"
            android:layout_alignParentStart="true"
            android:checked="false" />

        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/editText"
            android:layout_marginTop="27dp"
            android:layout_alignParentTop="true"
            android:layout_alignParentStart="true"
            android:layout_alignParentEnd="true" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Your Name"
            android:id="@+id/textView"
            android:layout_alignParentTop="true"
            android:layout_alignParentStart="true" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="New Button"
            android:id="@+id/button"
            android:layout_marginEnd="31dp"
            android:layout_marginTop="30dp"
            android:layout_below="@+id/question_cats_input"
            android:layout_alignParentEnd="true" />

    Java

    • 除MainActivty,需新增一項 Java Class,Farmer命名為QuestionsSpreadsheetWebService

    QuestionsSpreadsheetWebService

    • 將之前紀錄的<form id  Ex. https://docs.google.com/forms/d/e/ID
      及TextBox (entry.XXXX) Key In
    import retrofit2.Call;
    import retrofit2.http.Field;
    import retrofit2.http.FormUrlEncoded;
    import retrofit2.http.POST;

    public interface QuestionsSpreadsheetWebService {
        //<form id  Ex. https://docs.google.com/forms/d/e/ID
        @POST("1FAIpQLSdiO0IX-_wqnsNE6-cw/formResponse")
        @FormUrlEncoded
        Call<Void> completeQuestionnaire(
                //所需KeyIn的表格
                @Field("entry.568800221") String name,
                @Field("entry.707940740") String answerQuestionCat
        );
    }

    MainActivty

    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.EditText;

    import retrofit2.Call;
    import retrofit2.Callback;
    import retrofit2.Response;
    import retrofit2.Retrofit;

    public class MainActivity extends AppCompatActivity {

        private EditText nameInputField;
        private CheckBox catQuestionInputField;
        private Button Btn;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            nameInputField = (EditText) findViewById(R.id.editText);
            catQuestionInputField = (CheckBox) findViewById(R.id.question_cats_input);
            Btn = (Button) findViewById(R.id.button);

            Btn = (Button) findViewById(R.id.button);

            Retrofit retrofit = new Retrofit.Builder()
                    //<form id前的部分
                    .baseUrl("https://docs.google.com/forms/d/e/")
                    .build();


            final QuestionsSpreadsheetWebService spreadsheetWebService = retrofit.create(QuestionsSpreadsheetWebService.class);

            Btn.setOnClickListener(
                    new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            String nameInput = nameInputField.getText().toString();
                            String catQuestionInput = String.valueOf(catQuestionInputField.isChecked());
                            Call<Void> completeQuestionnaireCall = spreadsheetWebService.completeQuestionnaire(nameInput, catQuestionInput);
                            completeQuestionnaireCall.enqueue(callCallback);
                        }
                    }
            );
        }

        private final Callback<Void> callCallback = new Callback<Void>() {
            @Override
            public void onResponse(Response<Void> response) {
                Log.d("XXX", "Submitted. " + response);
            }

            @Override
            public void onFailure(Throwable t) {
                Log.e("XXX", "Failed", t);
            }

        };
    }

    注意

    Need include retrofit2 (retrofit-2.0.0-beta3)  點我下載

    將  retrofit-2.0.0-beta3.jar 複製到 專案底下,右鍵 Add as lib ,
    加入後應該沒有問題,若studio顯示 okhttp 問題時,

    則點擊 Gradle Scripts->bulid.gradle(Module: app)
    在 dependencies 中加入,

    compile 'com.squareup.retrofit2:retrofit:2.0.0-beta3'
    並刪除
    compile files('專案路徑/retrofit-2.0.0-beta3.jar')

    基本上重新Sync Now 即可正常開啟

    若還有 okhttp 問題 點我下載 okhttp.xml
    放置專案下 (\.idea\libraries)
    重新開啟,重新編譯,基本上就沒有問題

    參考資料
    Send app data to a web spreadsheet (Google Sheets)
    Retrofit
    用 Retrofit 2 简化 HTTP 请求
    Retrofit2.0使用详解

    2 則留言:

    1. 你好,請問這是否有不透過問卷的做法,就可以將資料寫入?

      回覆刪除
      回覆
      1. 現在我也不清楚google有沒有重新開啟api應用
        之前google api是可以直接存取,但我在做的時候就取消這塊了

        刪除