无需身份验证即可写入Google表格

时间:2017-12-10 11:13:25

标签: android ios mobile google-sheets google-spreadsheet-api

在我的一个项目中,我需要将应用程序(iOS和Android)中的数据写入Google Sheet文档。我需要将数据写入不属于用户的电子表格,电子表格在我的公司帐户下。

根据文档,对于这种情况,我可以使用 创建凭据> API密钥 以设置非身份验证密钥 我担心的是,任何人都可以在应用程序中获取此密钥(使用一些基本的逆向工程方法)。我有一个想法是使用 只写 凭据创建用户,并使用他的API-KEY来预先形成API请求。但我确信有更好的方法来实现这一目标。

我的选择是什么?非常感谢你!

1 个答案:

答案 0 :(得分:1)

你可以使用谷歌应用程序脚本解密一个甚至匿名的任何人都可以访问的webapp,然后在运行该脚本的应用程序中创建一个Async方法。 这里可以看到这样一个webapp的例子:https://gist.github.com/petyr47/7af08ec2d982399c1b4ace2734597d3b.js 然后你可以添加一个如下所示的AsyncTask方法:

public class SendRequest extends AsyncTask<String, Void, String> {


        protected void onPreExecute(){}

        protected String doInBackground(String... arg0) {

            try{

                //Enter script URL Here
                URL url = new URL("Your App Script Web App URL");

                JSONObject postDataParams = new JSONObject();

                //Passing scanned code as parameter

               postDataParams.put("sdata",scannedData);


                Log.e("params",postDataParams.toString());

                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(15000 /* milliseconds */);
            conn.setConnectTimeout(15000 /* milliseconds */);
            conn.setRequestMethod("GET");
            conn.setDoInput(true);
            conn.setDoOutput(true);

            OutputStream os = conn.getOutputStream();
            BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(os, "UTF-8"));
            writer.write(getPostDataString(postDataParams));

            writer.flush();
            writer.close();
            os.close();

            int responseCode=conn.getResponseCode();

            if (responseCode == HttpsURLConnection.HTTP_OK) {

                BufferedReader in=new BufferedReader(new InputStreamReader(conn.getInputStream()));
                StringBuffer sb = new StringBuffer("");
                String line="";

                while((line = in.readLine()) != null) {

                    sb.append(line);
                    break;
                }

                in.close();
                return sb.toString();

            }
            else {
                return new String("false : "+responseCode);
            }
        }
        catch(Exception e){
            return new String("Exception: " + e.getMessage());
        }
    }

    @Override
    protected void onPostExecute(String result) {
        Toast.makeText(getApplicationContext(), result,
                Toast.LENGTH_LONG).show();

    }
}

public String getPostDataString(JSONObject params) throws Exception {

    StringBuilder result = new StringBuilder();
    boolean first = true;

    Iterator<String> itr = params.keys();

    while(itr.hasNext()){

        String key= itr.next();
        Object value = params.get(key);

        if (first)
            first = false;
        else
            result.append("&");

        result.append(URLEncoder.encode(key, "UTF-8"));
        result.append("=");
        result.append(URLEncoder.encode(value.toString(), "UTF-8"));

    }
    return result.toString();
}

}

您可以使用以下方法执行此方法:

 new SendRequest().execute();

将方法中的参数替换为您要发送的内容。 希望这有帮助

这是Android的解决方案,虽然我可以帮助iOS,但你可以应用相同的原则。